首页 > 解决方案 > 错误:当通过扩展用户模型添加新用户时,“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'

当我尝试提交注册表单时发生错误

如果我在以其他用户身份登录时尝试注册,用户模型会更新,但配置文件模型没有变化

如何消除此错误?

标签: djangodjango-modelsdjango-formsdjango-authenticationdjango-users

解决方案


您应该从 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')

检查这个实现,看看它是否有效。


推荐阅读