2013-06-05 6 views
10

मेरे पास एक बहुत से रिश्ते के साथ एक मॉडल है जिसे मैं एक चेकबॉक्स चयन के साथ अद्यतन करना चाहता हूं, जबकि सबकुछ डिफ़ॉल्ट जेनेरिक रूप का उपयोग करता है, लेकिन जब मैं उस फॉर्म फ़ील्ड को फिर से परिभाषित करता हूं, तो यह केवल एक ही है जो 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

कुंडेडिटफॉर्म पर मेटा सूचनाएं आपको किसी भी फॉर्म फ़ील्ड में कस्टम विजेट सेट करने की संभावना देती हैं। – aRkadeFR

+0

दूसरे भाग के लिए, यह मॉडलform_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

संबंधित मुद्दे