Не удается заставить формы Django сохранять данные в модели User и Profile

Я пытаюсь расширить модель Django User путем создания модели профиля пользователя. Мне удается успешно создавать модели, но я не могу получить информацию, введенную в пользовательскую форму UserCreationForm для сохранения данных. Я не могу получить новые формы на той же странице и получить информацию, связанную с пользователем, для сохранения. При попытке я получаю ошибку 'Anonymous User has to data _meta'

models.py

class Profile(models.Model):
    '''
    periods = [
        ('-','-'),
        ('1','1'),
        ('2','2'),
        ('3','3'),
        ('4','4'),
        ('6','6'),
        ('7','7'),
    ]
    '''
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    period = models.IntegerField(default=1)
    first_name = models.CharField(max_length=100,default='Home')
    last_name = models.CharField(max_length=100,default='Simpson')
    
    def __str__(self):
        return f'{self.user.username}'

forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    class Meta:
        model = User
        fields = ['username','email','password1','password2']

class UserProfileForm(forms.ModelForm):
    periods = [
        (1,1),
        (2,2),
        (3,3),
        (4,4),
        (6,6),
        (7,7),
    ]
    period = forms.ChoiceField(choices=periods)
    first_name = forms.CharField(max_length=100)
    last_name = forms.CharField(max_length=100)
    class Meta:
        model = Profile
        fields = ['first_name','last_name','period']

signals.py

@receiver(post_save,sender=User)
def create_profile(sender,instance,created,**kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save,sender=User)
def save_profile(sender,instance,**kwargs):
    instance.profile.save()

views.py

def login(request):
    context = {
        'title':'Login',
    }
    return render(request,'users/login.html',context)

def register(request):
    if request.method == "POST":
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data.get('email')
            email_domain = re.search("@[\w.]+", email)
            if email_domain.group() == EMAIL_DOMAIN:
                form.save()
                username = form.cleaned_data.get('username')
                messages.success(request,f'Account created for {username}! You are now able to sign in.')
                return redirect('users-login')
            else:
                messages.error(request,f'Sorry. You are not authorized to register.')
    else:
        form = UserRegisterForm()
    context = {
        'title':'Register',
        'form':form
    }
    return render(request,'users/register.html',context)

Это происходит потому, что вы размещаете обе формы на странице регистрации. Если вы не создали ни одного пользователя, как вы можете создать профиль и как вы сможете добавлять или получать данные из него?

Теперь решение для этого есть,

1 . Вы создаете страницу для регистрации пользователя, скажем "users/register.html", когда он успешно зарегистрируется на ней, создаете сигнал для создания профиля для него, затем успешно регистрируете пользователя. Затем перенаправьте только что зарегистрированного пользователя на страницу изменения профиля.

  1. Примите обе формы на странице регистрации пользователя, но не проверяйте форму изменения профиля .Создайте пользователя в представлении и затем ссылайтесь на него в форме изменения профиля .

Простой бит кода для этого .

def registerUser(request) : 
    if request.method == "POST" :
        user_form = UserRegisterForm(request.POST)
        if user_form.is_valid():
            username = request.POST.get("username")
            # fields you require
            user = User(username = username , password = password)
            user.save()
            profile_field_objects = request.POST.get("profile_field_data")
            profile = Profile(user = user , profile_field_objects = profile_field_objects)
            profile.save()
     # rest you can code 
Вернуться на верх