Как использовать пользовательский виджет с общим 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,
}