Как использовать пользовательский виджет с общим UpdateView без необходимости переопределять всю форму?

У меня есть модель с отношением 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 = '/'

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())

Я знаю, что это имеет очень простое решение, поэтому за ваше терпение заранее заблаговременно.

Пока я нахожусь, может ли кто-нибудь порекомендовать какие-нибудь книги по джанго, которые стоит прочитать? Я просмотрел базовый учебник, вырыл документацию по мере необходимости и прочитал "Два сокета Django: https://django.2scoops.org/, поэтому, если вы можете подумать о книге для кого-то в мой уровень, это было бы очень полезно. Еще раз спасибо

Ответ 1

Попробуйте это, используя 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())

REF: 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 = '/'

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

Ответ 2

Здесь находится 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,
    }