我在Google App Engine中有一个带有ChoiceField的Django ModelForm,让我们说位置:
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_valid()。有没有办法在对象实例化期间抑制验证?或者其他一些方法来解决这个问题?
更新:我非常确定ModelFormMetaclass通过在创建表单时验证提供的实例来让我感到悲伤。仍不确定如何修复。
谢谢!
答案 0 :(得分:3)
必须有其他方法可以做到这一点,但最简单的方法是在表单的__init__()
方法中添加字段:
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},)
告诉我们这对您有何帮助。