【发布时间】: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