【问题标题】:Django - Change default widgets of fields in MultiColumnFieldDjango - 更改 MultiColumnField 中字段的默认小部件
【发布时间】:2014-10-24 12:38:10
【问题描述】:

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

如果还有什么不清楚的地方,欢迎提问。

【问题讨论】:

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


    【解决方案1】:

    因为widgetskwarg 自定义了现有的表单,所以应该通过formkwarg 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
    

    【讨论】:

    • 好的,大概就是这样,但我不确定我是否理解正确。这就是我对 modelform_factory 所做的,表单现在应该是,但如果我这样做,它就不起作用:Form = modelform_factory(self.model, CreateView.get_form_class(self), widgets= {'st_name':Textarea(), ... }) 还有什么我需要更改的吗?
    • 我在字段名中缺少前缀,现在可以使用了,谢谢!
    猜你喜欢
    • 2010-10-14
    • 2020-12-04
    • 2015-04-14
    • 2017-01-23
    • 2018-03-25
    • 2018-01-29
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多