【问题标题】:Django ModelForm not retrieving field's valueDjango ModelForm 不检索字段的值
【发布时间】:2018-09-29 13:55:49
【问题描述】:

我正在使用两个 ModelForm 来创建具有 Profile 实例的用户。 Profile ModelForm 有一个字段。我正在做 form.save(commit=False),设置表单中的必填字段(国家)以外的字段并保存。我收到一条错误消息,提示“country_id”不能为空。

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    country = models.ForeignKey(Country, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
    email_confirmed = models.BooleanField(default=False)

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

forms.py

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


class ProfileRegisterForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['country']

views.py

def register(request):
    if request.method == 'POST':
        user_form = UserRegisterForm(request.POST)
        profile_form = ProfileRegisterForm(request.POST)
        if user_form.is_valid() and profile_form.is_valid():
            user = user_form.save(commit=False)
            user.is_active = False
            profile = profile_form.save(commit=False)
            profile.user = user

            user.save()

            current_site = get_current_site(request)
            subject = 'Activate Your Account'
            message = render_to_string('account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)).decode(),
                'token': account_activation_token.make_token(user)
            })
            user.email_user(subject, message)
            return redirect('activation_email_sent')
    else:
        user_form = UserRegisterForm()
        profile_form = ProfileRegisterForm()

    return render(request, 'register.html', {'user_form': user_form, 'profile_form': profile_form})

【问题讨论】:

  • 当您保存user 时,post_save 会触发Profile.objects.create(user=instance),当country 不可为空且没有默认值时,它永远不会起作用!
  • 我试图让国家可以为空,但它被保存为空。
  • 你需要删除 post_save 的乐趣。

标签: python django django-forms django-views


【解决方案1】:

是的。我删除了post_save,使country 可以为空并分别保存userprofile。感谢您的帮助。

views.py

def register(request):
if request.method == 'POST':
    user_form = UserRegisterForm(request.POST)
    profile_form = ProfileRegisterForm(request.POST)
    if user_form.is_valid() and profile_form.is_valid():
        user = user_form.save(commit=False)
        user.is_active = False
        user.save()

        profile = profile_form.save(commit=False)
        profile.user = user
        profile.save()

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多