2013-06-05 8 views
10

Mam model z relacji ManyToMany, który chciałbym zaktualizować za pomocą widżetu CheckBoxSelectMultiple, podczas gdy wszystko inne używa domyślnej formy ogólnej, ale gdy ponownie zdefiniuję to pole formularza, jest ono jedyne wyświetlane w oknie UpdateView. Czy istnieje sposób użycia widgetu z jednym polem bez konieczności ponownego definiowania całego formularza?Jak używać widgetu niestandardowego z ogólnym UpdateView bez konieczności ponownego definiowania całego formularza?

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

wiem, ma to boleśnie proste rozwiązanie, więc dzięki za cierpliwość w góry każdego.

Gdy jestem w tym, czy ktoś może polecić jakieś książki django, które warto przeczytać? Przeszedłem przez samouczek bazowy, przekopałem dokumentację w razie potrzeby i przeczytałem Dwie łyżki Django: https://django.2scoops.org/, więc jeśli potrafisz wymyślić książkę dla kogoś na moim poziomie, byłoby to bardzo cenne. dzięki jeszcze raz

Odpowiedz

11

Spróbuj tego, ze 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

Można również użyć fabryki ModelForm jeśli trzeba tylko zrobić prosty ręczne:

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

+0

To było na pewno szybko. Wielkie dzięki. Próbowałem zaakceptować to jako odpowiedź, ale powiedziałem, że muszę poczekać 10 minut :) mimo wszystko, jeśli masz czas, możesz wskazać mi jakąś dokumentację na temat tego, co tu się dzieje? – skzryzg

+0

Metainformacje na KundeEditForm dają możliwość ustawienia niestandardowego widgetu do dowolnego pola formularza. – aRkadeFR

+0

Dla drugiej części robi to samo poprzez przekazanie argumentu pozycyjnego "widgets" do modelform_factory. – aRkadeFR

7

Oto mieszanka na tym, że pozwala na definiowanie słownika widgetów i nadal szanuje lista 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) 

Może być stosowany z CreateView, UpdateView itp Na przykład:

class KundleUpdate(ModelFormWidgetMixin, UpdateView): 
    model = Kunde 
    widgets = { 
     'unternehmenstyp': CheckboxSelectMultiple, 
    } 
+0

Bardzo eleganckie rozwiązanie. – davidscolgan

Powiązane problemy