【问题标题】:Cannot validate dynamic choices with Django ModelForm无法使用 Django ModelForm 验证动态选择
【发布时间】:2011-09-05 00:00:12
【问题描述】:

我在 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 通过在创建表单时验证提供的实例而让我很伤心。仍然不确定如何解决。

谢谢!

【问题讨论】:

    标签: django google-app-engine django-forms


    【解决方案1】:

    必须有其他方法可以做到这一点,但可能最直接的方法是在表单的__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},)
    

    让我们知道这对您有什么作用。

    【讨论】:

    • 嘿亚当,我曾尝试在 init 中添加选项但没有成功,但我没有尝试在那里声明字段。它似乎工作,所以感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 2013-08-22
    • 2011-01-09
    相关资源
    最近更新 更多