Django 调用创建其他窗体时出错

Django 调用创建其他窗体时出错,django,Django,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(ma

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 __unicode__(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, CHOICE_GENDER


class LocationForm(forms.ModelForm):
    city = forms.CharField(max_length=75)
    country = forms.CharField(max_length=25)

    class Meta:
        model = Location
        fields = ('city', 'country',)


class RegistrationForm(UserCreationForm):
    email = forms.CharField(max_length=75)
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    gender = forms.ChoiceField(choices=CHOICE_GENDER)
    birth = forms.DateField()
    location = LocationForm()

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

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.gender = self.cleaned_data['gender']
        user.birth = self.cleaned_data['birth']
        if commit:
            user.save()
        return user
forms.py中的此代码无效。由于以下错误,无法保存LocationForm:

country - This field is required. city - This field is required.
我还修改了forms.py,但仍然从上面得到了错误。

注册表单
中使用
LocationForm
可以在
视图中分别处理它们。py
将使代码更清晰,易于处理

if request.method == "POST":
    reg_form = RegistrationForm(request.POST)
    loc_form = LocationForm(request.POST)
    if reg_form.is_valid() and loc_form.is_valid():
        # since in your case they are dependent on each other
        # save location form and get location object
        location = loc_form.save()
        # now you can use it in your reg_form
        reg_form.cleaned_data['location_id'] = location.id
        registration = reg_form.save()
    else:
        # no need to handle this case only for explanation
        # use the forms, with valid post data initialized 
        # at the start of current if block
        pass
else:
    # create new forms for location and registration
    reg_form = RegistrationForm()
    loc_form = LocationForm()    
return render(request, 'signup.html', {'loc_form': loc_form, 'reg_form':reg_form})

在这里,您可以阅读更多有关如何在中处理多个嵌套表单的信息

那么我如何修改代码中的“else”部分:@MikiSoft请更新您的问题或在评论中共享代码,不要共享任何链接;不建议。没有新行时,我如何在回复中发布代码?这就是为什么我在Pastebin上共享它,你不打开它是荒谬的。@MikiSoft在某些网络Pastebin或其他共享服务上可能被阻止,这就是为什么我要求你在评论中(如果很小的话)或者在有问题的部分更新它;否则可能无法回答;)好的,我可以试着解释而不是显示代码:我想知道表单的提交是否失败,或者如果不是POST方法,在模板中呈现之前提交的数据的内容(更准确地说是以其形式),如果有。
if request.method == "POST":
    reg_form = RegistrationForm(request.POST)
    loc_form = LocationForm(request.POST)
    if reg_form.is_valid() and loc_form.is_valid():
        # since in your case they are dependent on each other
        # save location form and get location object
        location = loc_form.save()
        # now you can use it in your reg_form
        reg_form.cleaned_data['location_id'] = location.id
        registration = reg_form.save()
    else:
        # no need to handle this case only for explanation
        # use the forms, with valid post data initialized 
        # at the start of current if block
        pass
else:
    # create new forms for location and registration
    reg_form = RegistrationForm()
    loc_form = LocationForm()    
return render(request, 'signup.html', {'loc_form': loc_form, 'reg_form':reg_form})