0

可能重复:
使用重载的init验证表单

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

模型和模型形式

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...

根据 stackoverflow 的建议,我编辑了 modelform init以允许传递 country 变量。表单创建和 html 显示正常,一切正常,只是现在表单无法验证。

更新:好的,看起来我(意思是“你”)让它工作了。有几件事很丑陋,一旦修复它就可以了:

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

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

4

2 回答 2

1

您的更改是country第一个参数,但您将POST数据作为第一个参数传递。form = CarsForm(request.POST)

于 2012-08-23T20:48:52.160 回答
1

要么这是解决方案,要么你的复制粘贴有问题;)

您已经正确定义了被覆盖的__init__方法,但实际上并没有传递country参数;这样做看起来像这样:

form = CarsForm(country, request.POST)

这意味着它request.POST总是被存储在country并且永远不会传递给父类的__init__方法。

如果表单没有数据,is_valid()将始终返回False

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

于 2012-08-23T20:49:05.977 回答