【问题标题】:Cannot resolve keyword 'username' into field. Choices are: city, id, phone, etc无法将关键字“用户名”解析为字段。选项有:城市、id、电话等
【发布时间】:2017-06-19 01:06:45
【问题描述】:

我想就这些问题寻求帮助。我确实知道它似乎与关于同一问题的其他问题相似,但我确实环顾四周,并没有什么能真正解决我的问题。顺便说一句,这是我第二次在这里问,所以如果这条消息太长,请告诉我。谢谢!

我在 Django 1.8 和 Python 3.5 中使用 AllAuth

我想根据 AllAuth 提供的用户名实现一个简单的个人资料页面。问题是,我没有在我的模型中指定用户名或电子邮件字段,我只是扩展它以添加一些我想要的信息,但似乎 Django 只识别我扩展的字段并且我找不到从 AllAuth 获取该信息的正确方法。

这是我的代码(一些自定义字段是葡萄牙语,但所有核心内容都是英文):

profiles/models.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)

profiles/forms.py

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()

profiles/admin.py

from django.contrib import admin

# Register your models here.

from .models import Profile

admin.site.register(Profile)

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/adapter.py [注意这里显示了用户名],就像文档中指定的那样:http://django-allauth.readthedocs.io/en/latest/advanced.html

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)

profiles/urls.py

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

urlpatterns = [

    url(r'^(?P<username>[\w.@+-]+)/$', 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

【问题讨论】:

  • 尝试将此行 get_object_or_404(Profile, username=username) 更改为 get_object_or_404(Profile, user__username=username)
  • 没错^^
  • 谢谢,@anupsabraham!确实是这个问题!不幸的是,现在它引发了 404 错误,我猜这是因为它在数据库中找不到 user__username。我正在使用一个通过 Facebook 登录的测试用户,并在注册该用户时明确填写了用户名字段。有什么想法吗?
  • 您在哪个表中填写了用户名。你的AUTH_USER_MODEL 是什么?
  • 我不必在任何表中创建用户名,因为我使用的是 AllAuth 身份验证系统。我真的不确定什么是 AUTH_USER_MODEL,我从关于扩展用户模型的教程中复制了它。我现在正在寻找这个答案...

标签: python django django-allauth


【解决方案1】:

实际上,当您是用户时会发生此错误

bed = beding.objects.filter(id=request.POST['bed_id'])

并以这种形式获取

userid =  bed.value('userid')

插入

beding.objects.get(id=request.POST['bed_id'])

【讨论】:

    【解决方案2】:

    最后提到的解决方案不一定是正确输入“电子邮件”或“用户名”和密码。

    Django 应该安全地处理该异常。 解决方案在'AUTHENTICATION_BACKENDS'部分的settings.py文件中

    AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.ModelBackend",
    # "allauth.account.auth_backends.AuthenticationBackend",
    

    ]

    ModelBackend 可以正常处理这些对其他身份验证方法进行注释的异常。更多信息:https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#specifying-authentication-backends

    【讨论】:

      【解决方案3】:

      我扩展了 AbtractUser 类并将 USERNAME_FIELD 设置为电子邮件; 我还将用户名字段设置为无。 尝试使用错误的凭据以管理员身份登录会引发相同的错误。这是我的 CustomUser 模型。

      class CustomUser(AbstractUser):
          username = None
          email = models.EmailField(_('email address'), unique=True)
      
          USERNAME_FIELD = 'email'
          REQUIRED_FIELDS = []
      
          objects = CustomUserManager()
      
          def __str__(self):
              return self.email
      

      我只需要使用正确的电子邮件和密码即可成功登录。您可以通过以下命令创建超级用户;

      (venv)xyz_api$ python manage.py createsuperuser
      

      【讨论】:

        【解决方案4】:

        好的,我发现了问题。我花了很长时间,因为我没有以正确的方式看待它。

        问题不在于代码本身,而更多的是关于哪个模型实际存储了我需要的信息。在这种情况下,我想从数据库中获取用户和配置文件信息,而没有意识到它们是两个独立的模块。我试图从用户存储的个人资料信息中获取。

        原来是:

        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(新的和工作的)——注意导入如何从 Profile 更改为 User 以及我如何从 obj.profile 创建新用户 obj

        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)
        

        非常感谢大家的帮助!

        【讨论】:

          猜你喜欢
          • 2021-09-15
          • 2021-11-18
          • 2012-09-13
          • 2021-11-04
          • 1970-01-01
          • 2013-04-09
          • 2021-10-17
          • 1970-01-01
          • 2022-01-22
          相关资源
          最近更新 更多