2013-06-05 2 views
10

CheckBoxSelectMultiple 위젯으로 업데이트하려는 ManyToMany 릴레이션이있는 모델이 있습니다. 다른 모든 모델은 기본 제네릭 형식을 사용하지만, 해당 양식 필드를 다시 정의하면 UpdateView에 유일한 모델이 표시됩니다. 전체 양식을 재정의 할 필요없이 단 하나의 필드로 위젯을 사용하는 방법이 있습니까?전체 양식을 재정의 할 필요없이 일반 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/ 그래서 내 레벨의 누군가를위한 책을 생각할 수 있다면 크게 감사하겠습니다. 덕분에 다시

답변

11

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

+0

것은 확실히 빠른했다. 무리 감사. 나는 이것을 대답으로 받아 들여 보려고했지만 10 분을 기다려야한다고 대답했다. :) 시간이 있다면, 여기에 무슨 일이 벌어지고 있는지에 대한 문서를 가르쳐 주시겠습니까? – skzryzg

+0

KundeEditForm의 메타 정보는 사용자 정의 위젯을 모든 양식 필드로 설정할 수있는 기능을 제공합니다. – aRkadeFR

+0

두 번째 부분에서는 위치 매개 변수 인 "위젯"을 modelform_factory에 전달하여 동일한 작업을 수행합니다. – aRkadeFR

7

그 수에 당신은 위젯 사전을 정의하고 여전히 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, 
    } 
+0

매우 우아한 솔루션입니다. – davidscolgan