2012-08-23 48 views
0

可能重复:
Validating a form with overloaded initDjango的动态的ModelForm不会验证

我花了整个下午试图找出我做错了什么在这里,我知道这将是一些面子愚蠢的事情。当用户填写表格时,位置选择框取决于用户的国家并相应地列出不同的城市。

型号&的ModelForm

class Cars(models.Model): 
    owner = models.ForeignKey(User) 
    name = models.CharField(max_length=25) 
    location = models.PositiveIntegerField(default=1) 
    created = models.DateTimeField(default=utc_time) 

class CarsForm(ModelForm): 
    def __init__(self, country, *args, **kwargs): 
     super(CarsForm, self).__init__(*args, **kwargs) 
     self.fields['location'] = forms.ModelChoiceField(queryset=Cities.objects.filter(country=country)) 

    class Meta: 
     model = Cars 
     exclude = ('owner', 'created',) 

查看

def new_car(request): 
    if request.method == u'POST' and request.is_ajax(): 
     form = CarsForm(request.POST) 
     if form.is_valid(): 
         etc... 

在从计算器的建议,我编辑的ModelForm 初始化,使该国的变量传递。表单创建和html显示正常,一切都很好,只是现在表单不会验证。

UPDATE: 好了,它看起来像我(意为 '你')得到它的工作。有几件事情是丑陋的,一旦固定它的工作原理确定:

  • 位置字段类型变更为外键,修正 数据不匹配的问题
  • 初始化修改为接受国为kwarg
  • 的表单验证现在将变量作为kwarg传递给变量 CarsForm(request.POST,country = country)

SUCCESS!不到一个小时。非常感谢大家!

+0

是的,这是相同的基本问题。 –

+0

如果我错了,纠正我,但'ModelChoiceField'在它的'to_python()'方法中设置它的值来自queryset。这与“位置”模型中定义的字段类型不是直接矛盾吗?'location'不是外键,它是'PositiveIntegerField',这似乎是为什么会有验证错误。 – Brandon

+0

@Brandon这是一个次要问题。没有数据绑定到表单,所以'is_valid'提前保留而不运行任何实际验证。 –

回答

1

要么这是解决方案,或者您的复制和粘贴有问题;)

你已经正确定义过缠身__init__方法,但你没有真正传递country参数;这样做会是这样的:

form = CarsForm(country, request.POST) 

这意味着request.POST总是被存储在country,从不传递给父类的方法__init__

如果形式得​​不到数据,is_valid()总是返回False

旁注:SkillForm从哪里来?应该是CarsForm

+0

编辑拧紧--SkillForm应该是CarsForm!我会解决它以避免不必要的混淆。 – slumber

1

你的变化使得country的第一个参数,但你传递POST数据作为第一个参数。 form = CarsForm(request.POST)