ОШИБКА: объект AnonymousUser не имеет атрибута _meta, когда новый пользователь добавляется путем расширения пользовательской модели - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь добавить нового пользователя (используя форму регистрации) путем расширения модели пользователя с помощью ссылки «один на один». В форме регистрации я использую 2 формы, userSignup и userSignup_profile.

userSignup содержит сведения о пользователе для полей, которые уже находятся в 'auth_user'

userSignup_profile содержит другую информацию, такую ​​как адрес, пин-код, et c.

Пожалуйста, обратитесь по ссылке, которая объясняет, что я пытаюсь сделать: https://simpleisbetterthancomplex.com/tutorial/2016/07/22/how-to-extend-django-user-model.html#onetoone

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

Forms.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'

Ошибка возникает при попытке отправить форму регистрации

Если я пытаюсь зарегистрироваться, когда я вошел в систему как другой пользователь, Модель пользователя обновляется, но Без изменений в Модель профиля

Как можно Убрать эту ошибку?

1 Ответ

0 голосов
/ 30 апреля 2020

вы должны расширить свою форму UserSignUp из UserCreationForm

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

проверьте эту реализацию и посмотрите, работает ли она или нет.

...