2017-02-02 6 views
1

私はこれらの問題について助けを求めたいと思います。私はそれが同じ問題に関する他の質問に似ていることを知っていますが、私は周りを見回し、実際に私の問題を解決することはできませんでした。 Btw、ここで二度目の質問ですので、このメッセージが長すぎるかどうか教えてください。ありがとう!キーワード 'username'をフィールドに解決できません。選択肢は:市、ID、電話など

私はAllAuthから提供されたユーザ名に基づいて、簡単なプロフィールページを実装するジャンゴ1.8とPythonで3.5

をAllAuthを使用しています。問題は、モデルでユーザー名や電子メールフィールドを指定しなかったため、私はいくつかの情報を追加するために拡張しただけですが、Djangoは拡張したフィールドのみを識別しているようですAllAuthからその情報を取得する正しい方法を見つけることができません。

プロファイル/ models.py

forms.py

from django.conf import settings 
from django.db import models 
from django.db.models.signals import post_save 
from django.utils.encoding import smart_text 

UF_CHOICES = (
    ('SP', 'SP'), 
    ('RJ', 'RJ') 
) 

class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 

    uf = models.CharField(
         max_length = 2, 
         blank=False, 
         default = 'SP', 
         choices = UF_CHOICES, 
         verbose_name = 'UF', 
         ) 
    cidade = models.CharField(max_length=120, null=True, blank=True, default="Rio de Janeiro") 
    telefone = models.CharField(max_length = 20, blank=True, null=True, verbose_name = 'Telefone para Contato') 

    def __str__(self): 
     return smart_text(self.user) 



def post_save_user_model_receiver(sender, instance, created, *args, **kwargs): 
    if created: 
     try: 
      Profile.objects.create(user=instance) 
     except: 
      pass 

post_save.connect(post_save_user_model_receiver, sender=settings.AUTH_USER_MODEL) 

プロファイル/:ここ

は私のコード(カスタムフィールドのいくつかはポルトガル語であるが、すべてのコアのものが英語である)であります

from django import forms 
from .models import Profile 

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = [ 
      "uf", 
      "cidade", 
      "telefone", 
     ] 

    def profile(self, request, user): 
     user.uf = self.cleaned_data['uf'] 
     user.cidade = self.cleaned_data['cidade'] 
     user.telefone = self.cleaned_data['telefone'] 
     user.save() 

プロファイル/ admin.py

from django.contrib import admin 

# Register your models here. 

from .models import Profile 

admin.site.register(Profile) 

from django.conf import settings 
from allauth.account.adapter import DefaultAccountAdapter 

class MyAccountAdapter(DefaultAccountAdapter): 

    def get_login_redirect_url(self, request): 
     path = "/profiles/{username}/" 
     return path.format(username=request.user.username) 

プロファイル/ urls.py

を:views.py

プロファイル/ adapter.py

from django.contrib.auth.decorators import login_required 
from django.shortcuts import render, get_object_or_404 
from .models import Profile 

# Create your views here. 

@login_required 
def profile_detail(request, username=None): 
    obj = get_object_or_404(Profile, username=username) 
    context = { 
     "object": obj, 
    } 
    template = 'profile_detail.html' 
    return render(request, template, context) 

プロファイルは/ドキュメンテーションのように指定し、[ここにユーザ名が現れるのことに注意してください]

from django.conf.urls import url 
from .views import profile_detail 

urlpatterns = [ 

    url(r'^(?P<username>[\[email protected]+-]+)/$', profile_detail, name='profile_detail'), 
] 

最後に、エラーメッセージ:

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/profiles/Sofia/ 

Django Version: 1.8.17 
Python Version: 3.5.2 
Installed Applications: 
('django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'allauth', 
'allauth.account', 
'allauth.socialaccount', 
'allauth.socialaccount.providers.facebook', 
'crispy_forms', 
'newsletter', 
'profiles', 
'properties') 
Installed Middleware: 
('django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
'django.middleware.security.SecurityMiddleware') 


Traceback: 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/contrib/auth/decorators.py" in _wrapped_view 
    22.     return view_func(request, *args, **kwargs) 
File "/Users/Alex/Desktop/Hunters/src/profiles/views.py" in profile_detail 
    9.  obj = get_object_or_404(Profile, username=username) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/shortcuts.py" in get_object_or_404 
    155.   return queryset.get(*args, **kwargs) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/query.py" in get 
    325.   clone = self.filter(*args, **kwargs) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/query.py" in filter 
    679.   return self._filter_or_exclude(False, *args, **kwargs) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/query.py" in _filter_or_exclude 
    697.    clone.query.add_q(Q(*args, **kwargs)) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/sql/query.py" in add_q 
    1310.   clause, require_inner = self._add_q(where_part, self.used_aliases) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/sql/query.py" in _add_q 
    1338.      allow_joins=allow_joins, split_subq=split_subq, 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/sql/query.py" in build_filter 
    1150.   lookups, parts, reffed_expression = self.solve_lookup_type(arg) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/sql/query.py" in solve_lookup_type 
    1036.   _, field, _, lookup_parts = self.names_to_path(lookup_splitted, self.get_meta()) 
File "/Users/Alex/Desktop/Hunters/lib/python3.5/site-packages/django/db/models/sql/query.py" in names_to_path 
    1397.          "Choices are: %s" % (name, ", ".join(available))) 

Exception Type: FieldError at /profiles/Sofia/ 
Exception Value: Cannot resolve keyword 'username' into field. Choices are: cidade, id, telefone, uf, user, user_id 
+2

'get_object_or_404(Profile、username = username)'を 'get_object_or_404(Profile、user__username = username) 'に変更してみてください。 – anupsabraham

+1

これは正しいです^^ –

+0

ありがとう、@anupsabraham!確かに問題でした!残念ながら、現在404エラーが発生しています。これは、データベースのuser__usernameが見つからないためです。私はFacebookでログインしたテストユーザーを使用しています。このユーザーにサインインしたときにユーザー名フィールドを明示的に入力しました。何か案は? –

答えて

2

わかりました。問題を見つけました。私はそれを正しい方法で見ていないので、私は非常に長くなりました。

問題はコードそのものにはなく、実際にはどのモデルが必要な情報を実際に格納していたのかということでした。この場合、ユーザーとプロファイルの情報を、2つのモジュールであることを認識せずにデータベースから取得したかったのです。私はユーザーによって保存されたプロファイル情報から取得しようとしていました。

元だった:(古いものと間違った)

profiles.views.py

from django.contrib.auth.decorators import login_required 
from django.shortcuts import render, get_object_or_404 
from .models import Profile 

# Create your views here. 

@login_required 
def profile_detail(request, username=None): 
    obj = get_object_or_404(Profile, username=username) 
    context = { 
     "object": obj, 
    } 
    template = 'profile_detail.html' 
    return render(request, template, context) 

profiles.views.py(新規および作業) - インポートがにプロフィールからどのように変化するかに注意してくださいユーザーとどのように私はobj.profile

from django.contrib.auth.decorators import login_required 
from django.contrib.auth.models import User 
from django.shortcuts import render, get_object_or_404 

# Create your views here. 

@login_required 
def profile_detail(request, username=None): 
    obj = get_object_or_404(User, username=username) 
    user = obj.profile 
    context = { 
     "object": obj, 
     "user": user, 
    } 
    template = 'profile_detail.html' 
    return render(request, template, context) 

からすべての助けに感謝を新しいユーザーOBJを作成しました!

関連する問題