在我的应用程序中,我需要使用大量经常更改的遗留数据库,这意味着我使用的视图和模板必须能够处理许多不同的情况。在每个遗留表中都有一些标准化的字段。我使用this多列字段实现将它们包装到一个字段中,因为我想稍后为它们分配一些特殊行为。这很好用,表单自动显示MultiColumnField
中包含的所有字段及其默认小部件。保存到数据库也有效。
但现在我想将这些字段的默认小部件更改为不同的内容,我真的不知道在哪里分配它们。
我尝试使用MultiWidgets,但这似乎没有做我想要的。然后我尝试在管理表单的通用视图中设置form_class
:
class ThemeCreateView(CreateView):
def __init__(self, model=None, template_name = None, success_url = None):
self.model = model
self.template_name = template_name
self.success_url = success_url
self.form_class = modelform_factory(self.model, widgets=
{'st_name': CustomWidget(),
'st_key': CustomWidget(),
'st_meta': CustomWidget(),
super(ThemeCreateView, self).__init__()
我必须在__init__
中分配所有内容,因为我不知道哪个模型会调用该视图。在urls.py中使用.as_view()
调用该视图。
问题是,我在这里分配的小部件被忽略,表单仍然显示默认小部件。我猜他们会在以后重置为默认值?我是否必须覆盖其他地方?
我读到我可以使用模板将其更改为另一个小部件(至少如果我想使用HiddenInput-Widget),但模板也不知道哪些模型会击中它们,所以我认为可以'我真的使用除{{forms.as_p}}
任何想法在视图中/我可以在哪里设置小部件?也许直接在MultiColumnField
?对字段进行硬编码不会有问题,因为我只在这个特殊情况下使用该字段,但我不知道从哪里开始。
如果有任何不清楚的地方,请随时提出。
答案 0 :(得分:0)
由于widgets
kwarg自定义现有表单,因此应通过form
kwarg传递
Form = modelform_factory(Book, form=BookForm, widgets={"title": Textarea()})
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelform-factory-function
或者您可以手动定义表单并拒绝使用modelform_factory
class BaseForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(SomeForm, self).__init__(*args, **kwargs)
self.base_fields['st_name'].widget = CustomWidget()
self.base_fields['st_key'].widget = CustomWidget()
self.base_fields['st_meta'].widget = CustomWidget()
class NumberOneForm(BaseForm):
class Meta:
model = NumberOneModel
class NumberTwoForm(BaseForm):
class Meta:
model = NumberTwoModel