2016-04-05 36 views
0

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}) 

回答

1

删除locationRegistrationForm领域的元组应停止行为。

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

+0

太棒了,我现在明白了,我已经解决了这个问题 - 虽然很简单(我将用解决方案代码更新主要问题)!感谢您的解释! – MikiSoft