【问题标题】:Nested models form saving: This field is required error嵌套模型表单保存:此字段为必填错误
【发布时间】:2016-04-05 10:20:52
【问题描述】:

models.py:

from django.db import models
from django.contrib.auth.models import User as BaseUser

CHOICE_GENDER = ((1, 'Male'), (2, 'Female'))


class Location(models.Model):
    city = models.CharField(max_length=75)
    country = models.CharField(max_length=25)

    def __str__(self):
        return ', '.join([self.city, self.state])


class Users(BaseUser):
    user = models.OneToOneField(BaseUser, on_delete=models.CASCADE)
    gender = models.IntegerField(choices=CHOICE_GENDER)
    birth = models.DateField()
    location = models.ForeignKey(Location)

    class Meta:
        ordering = ('user',)

forms.py:

from django.contrib.auth.forms import UserCreationForm
from django import forms
from .models import Users, Location


class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        fields = '__all__'


class RegistrationForm(UserCreationForm):
    class Meta:
        model = Users
        fields = ('username', 'email', 'first_name', 'last_name', 'gender', 'birth', 'location')

views.py:

def signup(request):
    if request.method == "POST":
        reg_form = forms.RegistrationForm(request.POST)
        loc_form = forms.LocationForm(request.POST)
        if loc_form.is_valid():
            reg_form.location = loc_form.save()
            if reg_form.is_valid():
                reg_form.save()
                return redirect('./')
    reg_form = forms.RegistrationForm()
    loc_form = forms.LocationForm()
    return render(request, 'signup.html', {'loc_form': loc_form, 'reg_form': reg_form})

我无法完成这项工作,它给出了location - This field is required 错误。我已经尝试了views.py 中的所有组合,但由于这个原因,它从未通过reg_form.is_valid() 命令。有人可以帮我吗?提前致谢!


已解决:views.py 新的工作代码:

def signup(request):
    if request.method == "POST":
        reg_form = forms.RegistrationForm(request.POST)
        loc_form = forms.LocationForm(request.POST)
        if reg_form.is_valid():
            reg = reg_form.save(commit=False)
            if loc_form.is_valid():
                reg.location = loc_form.save()
                reg.save()
                return redirect('./')
    reg_form = forms.RegistrationForm()
    loc_form = forms.LocationForm()
    return render(request, 'signup.html', {'loc_form': loc_form, 'reg_form': reg_form})

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    RegistrationForm 字段元组中删除 location 应该会停止该行为。

    由于您对位置使用单独的表单,因此不应使用 RegistrationForm 填充 location 字段。

    【讨论】:

    • 太好了,我现在明白了,我已经解决了这个问题——不过这很简单(我将使用解决方案代码更新主要问题)!谢谢你的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2021-06-28
    • 1970-01-01
    • 2022-12-30
    • 2011-12-02
    • 2010-11-11
    相关资源
    最近更新 更多