如何使用具有通用UpdateView的自定义窗口小部件而无需重新定义整个窗体?

skz*_*yzg 12 django django-forms django-generic-views

我有一个具有ManyToMany关系的模型,我想用CheckBoxSelectMultiple小部件更新,而其他一切都使用默认的通用形式,但是当我重新定义那个表单字段时,它是唯一一个出现在UpdateView中的表单字段.有没有办法只使用一个字段的小部件,而无需重新定义整个表单?

Views.py:

from django.views.generic.edit import UpdateView

from kunden.models import Kunde, Unternehmenstyp
from kunden.forms import KundeEditForm

class KundeUpdate(UpdateView):
    model = Kunde
    form_class =  KundeEditForm
    template_name = 'kunden/kunde_update.html'
    success_url = '/'
Run Code Online (Sandbox Code Playgroud)

forms.py:

from django.forms.widgets import CheckboxSelectMultiple
from django.forms import ModelMultipleChoiceField,ModelForm

from kunden.models import Kunde, Unternehmenstyp

class KundeEditForm(ModelForm):
    model = Kunde
    unternehmenstyp = ModelMultipleChoiceField(widget=CheckboxSelectMultiple,required=True, queryset=Unternehmenstyp.objects.all())
Run Code Online (Sandbox Code Playgroud)

我知道这有一个非常简单的解决方案,所以感谢大家提前耐心等待.

虽然我在这里可以推荐任何值得阅读的django书吗?我已经完成了基础教程,根据需要挖掘了文档,并阅读了Django的两个Scoops:https://django.2scoops.org/所以如果你能为我这个级别的人想到一本书,那就是非常感激.再次感谢

Tho*_*mas 12

试试这个,用class Meta:

from django.forms.widgets import CheckboxSelectMultiple
from django.forms import ModelMultipleChoiceField,ModelForm

from kunden.models import Kunde, Unternehmenstyp

class KundeEditForm(ModelForm):
    class Meta: # model must be in the Meta class
        model = Kunde
    unternehmenstyp = ModelMultipleChoiceField(widget=CheckboxSelectMultiple,required=True, queryset=Unternehmenstyp.objects.all())
Run Code Online (Sandbox Code Playgroud)

参考:https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#modelform

如果您只需要进行简单的覆盖,也可以使用modelform工厂:

from django.views.generic.edit import UpdateView
from django.forms.models import modelform_factory

from kunden.models import Kunde, Unternehmenstyp

class KundeUpdate(UpdateView):
    model = Kunde
    form_class =  modelform_factory(Kunde,
        widgets={"unternehmenstyp": CheckboxSelectMultiple })
    template_name = 'kunden/kunde_update.html'
    success_url = '/'
Run Code Online (Sandbox Code Playgroud)

参考:https://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#modelform-factory-function

  • Django v1.8 要求您将 _fields_ 或 _excludes_ 传递给模型 form_factory。进行更改后(可能会包含很长的字段列表),代码变得非常难看,以至于我更喜欢​​ Jonathan Potter 的答案中显示的 ModelFormWidgetMixin。 (2认同)

Jon*_*ter 12

这是一个mixin,允许您定义小部件字典并仍然尊重fields列表:

from django.forms.models import modelform_factory

class ModelFormWidgetMixin(object):
    def get_form_class(self):
        return modelform_factory(self.model, fields=self.fields, widgets=self.widgets)
Run Code Online (Sandbox Code Playgroud)

它可以与CreateView,UpdateView等一起使用.例如:

class KundleUpdate(ModelFormWidgetMixin, UpdateView):
    model = Kunde
    widgets = {
        'unternehmenstyp': CheckboxSelectMultiple,
    }
Run Code Online (Sandbox Code Playgroud)