首页 > 解决方案 > 在项目中更新用户模型我应该如何编写视图以将数据保存到配置文件模型

问题描述

在此处输入图像描述我正在尝试模仿本教程,特别是为用户创建个人资料:https ://ruddra.com/posts/django-custom-user-migration-mid-phase-project/

但是,我无法让它工作,如何编写视图以将表单输入保存到 Profile 模型中。从屏幕截图中,您可以看到 first_name、last_name 等没有从表单输入中保存,即使它们是必填字段。在没有任何输入信息的情况下创建了用户“ddkl”。我尝试输入“John”、“Smith”、“90210”等,但没有从表单中保存。编辑:弄清楚它正在将字段保存到核心用户模型。任何想法如何让它也保存到个人资料。

Django 版本 == 2.2.3。发现无法使用 get_profile(),而是尝试使用信号:@receiver(post_save, sender=User)。

这是我的个人资料模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    key = models.CharField(max_length=25, null=True, blank=True)
    first_name = models.CharField(max_length=25)
    last_name = models.CharField(max_length=25)
    address1 = models.CharField(null=True, max_length=100, blank=True)
    address2 = models.CharField(null=True, max_length=100, blank=True, default="")
    zipcode = models.CharField(max_length=10, null=True, blank=True,
    help_text="zipcode")
    state = models.CharField(null=True, max_length=2, blank=True)
    email = models.EmailField(max_length = 250, unique=True,
    verbose_name = 'email_address')
    username = models.CharField(max_length = 25)
    password = models.CharField(max_length =25, null=True)


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

def __str__(self):   
    return f'{self.first_name} ({self.last_name}) ({self.email})'

这是我的views.py。它不起作用,我似乎无法将此模型保存到配置文件。

def payments(request):
    if request.method == "POST":
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            profile = form.save(commit=False)
            # WHAT SHOULD I DO HERE TO SAVE TO PROFILE MODEL
            profile.user = request.user 
            profile.key = "".join(random.choice(string.digits) for i in range(20))
            profile.save()
            messages.success(request, f'Your account has been created! Please proceed to agreements and payment.')
            return redirect('agreements_page')
     else:
        form = CustomUserCreationForm(request.POST)
     return render(request, 'premium/payments.html', {'form': form})

这是我的forms.py:

    Profile = get_user_model()

class CustomUserCreationForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['first_name', 'last_name', 'email', 'zipcode', 'username']

    def clean_password(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords do not match")
        return password2


    def save(self, commit=True):
        user = super(CustomUserCreationForm, self).save(commit=False)
        user.username = self.cleaned_data['username']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.zipcode = self.cleaned_data['zipcode']
        user.email = self.cleaned_data['email']
        user.set_password(self.cleaned_data['password1'])

        if commit:
            user.save()
        return user

基本上,我需要帮助重写我评论的部分视图。

问题截图:数据不会保存,如电子邮件、名字、姓氏。

编辑:我应该指定模型吗?或者,还有更好的方法:

Profile.objects.create(user=profile.user, first_name=form.cleaned.data['first_name'],...) 

标签: djangoformsdjango-models

解决方案


推荐阅读