无法使用Django ModelForm验证动态选择
我在Google App Engine中有一个Django模型表单,其中有一个ChoiceField,比如位置:无法使用Django ModelForm验证动态选择,django,google-app-engine,django-forms,Django,Google App Engine,Django Forms,我在Google App Engine中有一个Django模型表单,其中有一个ChoiceField,比如位置: class MyForm(ModelForm): location = ChoiceField(label="Location") class Meta: model = MyModel 为了动态添加位置选项,并且不会出现应用程序缓存问题,我在表单初始化后添加它们: form = MyForm(request.POST, instance=my_i
class MyForm(ModelForm):
location = ChoiceField(label="Location")
class Meta:
model = MyModel
为了动态添加位置选项,并且不会出现应用程序缓存问题,我在表单初始化后添加它们:
form = MyForm(request.POST, instance=my_instance)
form.fields['location'].choices = Location.all().fetch(1000)
我现在遇到的问题是,当表单通过request.POST中的数据进行初始化时,选项还不存在,并且我收到一个错误,指出做出了无效的选择(因为该值在选项列表中还不存在)
我不喜欢在初始化表单时进行验证,而不是等到调用form.is\u valid()时才进行验证。在我的对象实例化过程中,有什么方法可以抑制验证吗?或者其他方法来解决这个问题
更新:我很确定ModelFormMetaclass在创建表单时验证了提供的实例,这让我很伤心。但仍然不确定如何修复
谢谢 必须有其他方法来实现这一点,但最简单的方法可能是在表单的
\uuuu init\uuuu()方法中添加字段:
class MyForm(ModelForm):
...
def __init__(self, *args, **kwargs):
try:
dynamic_choices = kwargs.pop('dynamic_choices')
except KeyError:
dynamic_choices = None # if normal form
super(MyForm, self).__init__(*args, **kwargs)
if dynamic_choices is not None:
self.fields['location'] = ModelChoiceField(
queryset=dynamic_choices)
class Meta:
model = MyModel
你的观点会是这样的:
def my_view(request):
locations = Location.objects.all() # or filter(...) or whatever
dynamic_form = MyForm(dynamic_choices=locations)
return direct_to_template(request,
'some_page.html',
{'form': dynamic_form},)
让我们知道这对您是如何起作用的。嘿,Adam,我曾尝试在init中添加选项,但没有成功,但是我没有尝试在那里声明字段。不过它似乎很有效,所以谢谢你的建议!