2011-02-24 8 views
11

मुझे एक फॉर्म बनाने की आवश्यकता है, जिसमें 1 चयन और 1 टेक्स्ट इनपुट है। चयन डेटाबेस से लिया जाना चाहिए। मॉडल इस तरह दिखता है:फील्ड विकल्प() क्वेरीसेट के रूप में?

class Province(models.Model): 
    name = models.CharField(max_length=30) 
    slug = models.SlugField(max_length=30) 

    def __unicode__(self): 
     return self.name 

यह इस के लिए पंक्तियों केवल व्यवस्थापक द्वारा जोड़ रहे हैं, लेकिन सभी उपयोगकर्ताओं रूपों में देख सकते हैं। मैं उस से मॉडलफॉर्म बनाना चाहता हूं। मैंने ऐसा कुछ किया:

class ProvinceForm(ModelForm): 
    class Meta: 
     CHOICES = Province.objects.all() 

     model = Province 
     fields = ('name',) 
     widgets = { 
      'name': Select(choices=CHOICES), 
     } 

लेकिन यह काम नहीं करता है। चयन टैग एचटीएमएल में प्रदर्शित नहीं होता है। मैंने क्या गलत किया?

अद्यतन:

यह समाधान काम करता है के रूप में मैं यह काम करने के लिए wanto:

class ProvinceForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ProvinceForm, self).__init__(*args, **kwargs) 
     user_provinces = UserProvince.objects.select_related().filter(user__exact=self.instance.id).values_list('province') 
     self.fields['name'].queryset = Province.objects.exclude(id__in=user_provinces).only('id', 'name') 

    name = forms.ModelChoiceField(queryset=None, empty_label=None) 

    class Meta: 
     model = Province 
     fields = ('name',) 

उत्तर

6

ModelForm अपने सभी जरूरतों को शामिल किया गया (यह भी जांच Conversion List)

मॉडल:

class UserProvince(models.Model): 
    user = models.ForeignKey(User) 
    province = models.ForeignKey(Province) 

फॉर्म:

class ProvinceForm(ModelForm): 
    class Meta: 
     model = UserProvince 
     fields = ('province',) 

दृश्य: विधि है कि सिर्फ "काम करता है" के लिए

if request.POST: 
     form = ProvinceForm(request.POST) 
     if form.is_valid(): 
      obj = form.save(commit=True) 
      obj.user = request.user 
      obj.save() 
    else: 
     form = ProvinceForm() 
+0

मैंने अपना पोस्ट कामकाजी समाधान के साथ अपडेट किया है। – robos85

+6

+1: लेकिन यह 'प्रतिबद्ध = गलत' नहीं होना चाहिए, अन्यथा आप डीबी को दो बार –

11

पढ़ें Maersu का जवाब।

आप, अनुकूलित करने के लिए पता है कि विकल्प tuples की एक सूची लेता चाहते हैं, यानी (('val','display_val'), (...), ...)

विकल्प डॉक:

एक iterable (जैसे, किसी सूची या टपल) को 2-tuples के इस फ़ील्ड के लिए विकल्पों के रूप में उपयोग करें।

from django.forms.widgets import Select 


class ProvinceForm(ModelForm): 
    class Meta: 
     CHOICES = Province.objects.all() 

     model = Province 
     fields = ('name',) 
     widgets = { 
      'name': Select(choices=((x.id, x.name) for x in CHOICES)), 
     } 
+0

हाय @ यूज, मैं मॉडलफॉर्म का उपयोग नहीं कर रहा हूं, लेकिन मेरे पास एक समान आवश्यकता है जहां मुझे मॉडल में चार्फील्ड पर क्वेरीसेट से विकल्पों की आवश्यकता है अपने आप। मैंने आपके सुझाए गए तरीके की कोशिश की लेकिन मेरे मामले में मुझे त्रुटि दे रही है जैसे कि "django.core.exceptions.AppRegistryNotReady: मॉडल अभी तक लोड नहीं हुए हैं।", जहां यह कहता है कि मॉडल अभी तक लोड नहीं हुआ है। तो कोई विचार है कि हम इसे मॉडल कैसे प्राप्त कर सकते हैं? – CrazyGeek

+0

@CrazyGeek किसी भी तरह से, जहां भी आप इसे इंजेक्ट कर रहे हैं, अगर इसे मॉडल क्लास इनिट टाइम (यानी ऐप तैयार करने से पहले) कहा जाता है तो यह एक स्थिर मूल्य होने वाला है .. पुनरारंभ होने तक आकार नहीं लेगा। आपको यह सुनिश्चित करना चाहिए कि यह मॉडलफॉर्म में है, या प्रासंगिक * व्यू * कोड जो प्रति अनुरोध निष्पादित किया गया है। –

+0

मैं मॉडलफॉर्म का उपयोग नहीं कर रहा हूं क्योंकि मैं केवल एपीआई के लिए django का उपयोग कर रहा हूं। – CrazyGeek