Python 将FormMixin/FormView与动态创建的表单一起使用
在处理动态创建的Python 将FormMixin/FormView与动态创建的表单一起使用,python,django,forms,mixins,Python,Django,Forms,Mixins,在处理动态创建的表单时(比方说,为了在运行时填充一个多选字段),是否有一种干净的编程方式来使用这种表单以及表单视图类 class MultipleChoiceForm(forms.Form): def __init__(self, options, *args, **kwargs): super(MultipleChoiceForm, self).__init__(*args, **kwargs) self.fields['calendars'] = fo
表单
时(比方说,为了在运行时填充一个多选字段),是否有一种干净的编程方式来使用这种表单
以及表单视图
类
class MultipleChoiceForm(forms.Form):
def __init__(self, options, *args, **kwargs):
super(MultipleChoiceForm, self).__init__(*args, **kwargs)
self.fields['calendars'] = forms.MultipleChoiceField(
widget=forms.CheckboxSelectMultiple,
choices=[(o['id'], o['summary']) for o in options],
required=True)
根据now,我设法重载了我的FormView
的get\u form()
方法:
def get_form(self, form_class=None):
"""
Returns an instance of the form to be used in this view.
"""
if form_class is None:
form_class = self.get_form_class()
return form_class(self.options, **self.get_form_kwargs())
但我觉得有点不太对劲。。。可能已经有人问过这个问题,但是对于这个基本场景来说,这是一个更简洁、更容易的解决方案吗?替代
get\u form\u kwargs
稍微更简洁一些。请参阅我上周对的回答。@Alasdair正确,但我不认为这将使我免于重写大部分Mixin逻辑(验证、绑定……)的负担:/为什么您认为您的代码会破坏验证?您不必重写mixin逻辑-重写get_form_kwargs
可以在实例化表单时添加额外的kwargs选项。表单绑定/验证代码的其余部分应保持不变。@Alasdair POST因“选择有效选项”而失败,表单在没有任何选择的情况下重新呈现:它似乎没有保留我在运行时创建的选项……是的,您需要确保对视图的GET和POST请求的选项
相同。如果您在URL(例如在查询字符串中)或request.POST
(例如作为隐藏字段)中包含这些选项,请注意用户可能会对其进行篡改。