17

我有一个具有 ManyToMany 关系的模型,我想使用 CheckBoxSelectMultiple 小部件对其进行更新,而其他所有内容都使用默认的通用表单,但是当我重新定义该表单字段时,它是唯一显示在 UpdateView 中的表单字段。有没有一种方法可以使用只有一个字段的小部件而不必重新定义整个表单?

视图.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 = '/'

表格.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())

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

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

4

2 回答 2

16

这是一个 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)

它可以与 CreateView、UpdateView 等一起使用。例如:

class KundleUpdate(ModelFormWidgetMixin, UpdateView):
    model = Kunde
    widgets = {
        'unternehmenstyp': CheckboxSelectMultiple,
    }
于 2015-01-15T19:15:13.647 回答
14

试试这个,用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())

参考:https ://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#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 = '/'

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

于 2013-06-05T10:09:02.457 回答