django - 错误:当通过扩展用户模型添加新用户时,“AnonymousUser”对象没有属性“_meta”
问题描述
我正在尝试通过使用一对一链接扩展用户模型来添加新用户(使用注册表单)。在注册表单中,我使用了 2 个表单,userSignup 和 userSignup_profile。
userSignup 包含已在“auth_user”中的字段的用户详细信息
userSignup_profile 包含其他信息,如地址、密码等。
请参阅解释我要做什么的链接:https ://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone
模型.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
phone = models.CharField(max_length=10)
address = models.TextField(max_length=200)
pincode = models.IntegerField(default=0)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
表格.py
class userSignup(forms.ModelForm):
class Meta:
model = User
fields = ('first_name', 'last_name','username', 'password', 'email')
class userSignup_profile(forms.ModelForm):
class Meta:
model = Profile
fields = ('phone', 'address', 'pincode')
user_signup.html
<body>
<form action="user_signup" method="POST">
{% csrf_token %}
{{form.as_p}}
{{ profile_form.as_p}}
<input id="next" type="hidden" name="next" value=" {{ request.GET.next }} "/>
<button class="primary" type="submit" value="login">SIGNUP </button>
</form>
</body>
视图.py
def user_signup(request):
if request.method == "POST":
user_form = userSignup(request.POST, instance=request.user)
profile_form = userSignup_profile(request.POST, instance=request.user.profile)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
return redirect('/')
else:
return redirect('user_signup')
else:
form = userSignup()
profile_form = userSignup_profile()
return render(request,"user_signup.html",{'form':form, 'profile_form':profile_form})
错误 :
Request Method: POST
Request URL: http://127.0.0.1:8000/user_signup
Django Version: 3.0.5
Python Version: 3.7.2
Installed Applications:
['shoppingCart.apps.ShoppingcartConfig',
'userAccess.apps.UseraccessConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\ADI COLLEGE DOCUMENTS\Projects\djangoProject\userAccess\views.py", line 36, in user_signup
user_form = userSignup(request.POST, instance=request.user)
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\forms\models.py", line 293, in __init__
object_data = model_to_dict(instance, opts.fields, opts.exclude)
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\forms\models.py", line 84, in model_to_dict
opts = instance._meta
File "C:\Users\lenovo\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\utils\functional.py", line 225, in inner
return func(self._wrapped, *args)
Exception Type: AttributeError at /user_signup
Exception Value: 'AnonymousUser' object has no attribute '_meta'
当我尝试提交注册表单时发生错误
如果我在以其他用户身份登录时尝试注册,用户模型会更新,但配置文件模型没有变化
如何消除此错误?
解决方案
您应该从 UserCreationForm 扩展您的 UserSignUp 表单
from django.contrib.auth.forms import UserCreationForm
class userSignup(UserCreationForm):
class Meta:
model = User
fields = ('first_name', 'last_name','username', 'password', 'email')
而且也不需要将实例传递给您的表单类。您可以只保存表单,然后将保存的数据传递到您的个人资料表单。
if request.method == "POST":
user_form = userSignup(request.POST, instance=request.user)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
profile_form = userSignup_profile(request.POST,
instance=user)
profile_form.save()
return redirect('/')
else:
return redirect('user_signup')
检查这个实现,看看它是否有效。
推荐阅读
- microsoft-graph-api - 来自 MS Graph API 的重复 CallRecords
- ios - CGBitmapContext 和 CVPixelBuffer 的视频输出失真
- nativescript - 显示完整的异常堆栈 (Nativescript)
- oracle - Oracle:为什么我必须使用 TO_DATE 来提取数据?
- python - 比较两个图像,如果它们具有几乎相同的 RGB 颜色分布
- python - 从 Seaborn 散点图中删除两个图例中的一个
- javascript - 如何通过 MapView 区域更改更改 TouchableOpacity 颜色?
- reactjs - 材质 ui 样式不适用
- php - Xcode的手动配置
- java - 如何设置 VSCODE 来创建 Maven 项目?