可能重复:
使用重载的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) 传递
成功!不到一个小时。非常感谢大家!!