2013-06-05 8 views
10

私はCheckBoxSelectMultipleウィジェットで更新したいManyToMany関係のモデルを持っていますが、他のすべてはデフォルトの汎用フォームを使用しますが、その1つのフォームフィールドを再定義するとUpdateViewに唯一表示されます。フォーム全体を再定義することなく、1つのフィールドだけでウィジェットを使用する方法はありますか?フォーム全体を再定義することなく、汎用の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の2つのスクープを読んでください:https://django.2scoops.org/私のレベルの誰かのための本を考えることができれば、それは大歓迎です。おかげで再び

答えて

11

class Metaで、これを試してみてください:

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:

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:あなただけの単純なオーバーライドを作成する必要がある場合は、またのModelFormファクトリを使用することができますhttps://docs.djangoproject.com/en/1.5/topics/forms/modelforms/#modelform

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

+0

確かに速かったこと。本当にありがとう。私はこれを答えとして受け入れようとしましたが、10分待たなければならないと言いました:) もし時間があれば、ここで何が起こっているのかに関するいくつかの文書を指摘できますか? – skzryzg

+0

KundeEditFormのメタ情報は、任意のフォームフィールドにカスタムウィジェットを設定することができます。 – aRkadeFR

+0

2番目の部分では、位置引数 "widgets"を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

関連する問題