Django - 更改MultiColumnField中字段的默认小部件

时间:2014-10-24 12:38:11

标签: python django django-templates django-views django-models

在我的应用程序中,我需要使用大量经常更改的遗留数据库,这意味着我使用的视图和模板必须能够处理许多不同的情况。在每个遗留表中都有一些标准化的字段。我使用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?对字段进行硬编码不会有问题,因为我只在这个特殊情况下使用该字段,但我不知道从哪里开始。

如果有任何不清楚的地方,请随时提出。

1 个答案:

答案 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