python Django एकाधिक विकल्प फ़ील्ड/चेकबॉक्स एकाधिक का चयन करें



select checkbox (4)

सही तरीके से काम करने के लिए प्रोफ़ाइल विकल्पों को ManyToManyField के रूप में सेट करने की आवश्यकता है।

तो ... आपका मॉडल इस तरह होना चाहिए:

class Choices(models.Model):
  description = models.CharField(max_length=300)

class Profile(models.Model):
  user = models.ForeignKey(User, blank=True, unique=True, verbose_name='user')
  choices = models.ManyToManyField(Choices)

फिर, डेटाबेस को सिंक करें और विभिन्न विकल्पों के साथ विकल्पों को लोड करें जिन्हें आप उपलब्ध करना चाहते हैं।

अब, मॉडलफॉर्म खुद का निर्माण करेगा ...

class ProfileForm(forms.ModelForm):
  Meta:
    model = Profile
    exclude = ['user']

और अंत में, दृश्य:

if request.method=='POST':
  form = ProfileForm(request.POST)
  if form.is_valid():
    profile = form.save(commit=False)
    profile.user = request.user
    profile.save()
else:
  form = ProfileForm()

return render_to_response(template_name, {"profile_form": form}, context_instance=RequestContext(request))

यह उल्लेख किया जाना चाहिए कि आप विरासत सहित दो अलग-अलग तरीकों से प्रोफाइल स्थापित कर सकते हैं। उस ने कहा, यह आपके लिए भी काम करना चाहिए।

सौभाग्य।

मेरे पास एक Django एप्लिकेशन है और उपयोगकर्ता की प्रोफ़ाइल में एकाधिक विकल्प चेकबॉक्स प्रदर्शित करना चाहता हूं। फिर वे कई वस्तुओं का चयन करने में सक्षम होंगे।

यह मेरे models.py का सरलीकृत संस्करण है:

from profiles.choices import SAMPLE_CHOICES

class Profile(models.Model):
    user = models.ForeignKey(User, unique=True, verbose_name_('user'))
    choice_field = models.CharField(_('Some choices...'), choices=SAMPLE_CHOICES, max_length=50)

और मेरा फॉर्म वर्ग:

class ProfileForm(forms.ModelForm):
    choice_field = forms.MultipleChoiceField(choices=SAMPLE_CHOICES, widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Profile

और मेरे विचार.py:

if request.method == "POST":
    profile_form = form_class(request.POST, instance=profile)
    if profile_form.is_valid():
        ...
        profile.save()
return render_to_response(template_name, {"profile_form": profile_form,}, context_instance=RequestContext(request))

मैं देख सकता हूं कि पोस्ट केवल एक मान भेज रहा है:

choice_field u'choice_three' 

और स्थानीय वर्म्स पैराम्स एक सूची भेज रहा है:

[u'choice_one', u'choice_two', u'choice_three']

सभी फॉर्म फ़ील्ड सही दिखाते हैं, लेकिन जब मैं कोई पोस्ट सबमिट करता हूं, तो मुझे एक त्रुटि मिलती है

त्रुटि बाध्यकारी पैरामीटर 7 - शायद असमर्थित प्रकार।

क्या मुझे दृश्य में कई विकल्प फ़ील्ड को आगे संसाधित करने की आवश्यकता है? क्या मॉडल फ़ील्ड प्रकार सही है? किसी भी मदद या संदर्भ की सराहना की जाएगी।


Answer #1

मॉडल। खरीफिल्ड विकल्पों में से एक का एक चारफिल्ड प्रतिनिधित्व है। आप जो चाहते हैं वह विकल्पों का एक सेट है। यह django (अभी तक) में लागू नहीं प्रतीत होता है।

आप इसके लिए कई फ़ील्ड का उपयोग कर सकते हैं, लेकिन इसका नुकसान यह है कि विकल्पों को डेटाबेस में रखना होगा। यदि आप हार्ड कोड किए गए विकल्पों का उपयोग करना चाहते हैं, तो शायद यह वही नहीं है जो आप चाहते हैं।

एक मॉडलफिल्ल्ड MultipleChoiceField चॉइसफ़िल्ल्ड को लागू करके http://djangosnippets.org/snippets/1200/ पर एक django स्निपेट है जो आपकी समस्या को हल करने के लिए प्रतीत होता है।


Answer #2

ब्रेंट का समाधान बिल्कुल सही है, लेकिन मुझे इसे कई चुनिंदा चेकबॉक्स और commit=false साथ काम करने के लिए संशोधित करने की आवश्यकता है। मेरा समाधान यहाँ है:

models.py

class Choices(models.Model):
    description = models.CharField(max_length=300)

class Profile(models.Model):
   user = models.ForeignKey(User, blank=True, unique=True, verbose_name_('user'))
   the_choices = models.ManyToManyField(Choices)

forms.py

class ProfileForm(forms.ModelForm):
    the_choices = forms.ModelMultipleChoiceField(queryset=Choices.objects.all(), required=False, widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Profile
        exclude = ['user']

views.py

if request.method=='POST':
    form = ProfileForm(request.POST)
    if form.is_valid():
        profile = form.save(commit=False)
        profile.user = request.user
        profile.save()
        form.save_m2m() # needed since using commit=False
    else:
        form = ProfileForm()

return render_to_response(template_name, {"profile_form": form}, context_instance=RequestContext(request))

Answer #3

ManyToManyField अच्छी पसंद नहीं है। आप एकाधिक ChoiceField को लागू करने के लिए कुछ स्निपेट का उपयोग कर सकते हैं। आप मल्टीसेलेफ़िल्फ़ द्वारा अल्पविराम से अलग मूल्यों (फ़ील्ड + फॉर्मफिल्ड) के साथ प्रेरित हो सकते हैं लेकिन इसमें कुछ बग है। और आप django-multiselectfield इंस्टॉल कर सकते हैं। यह और भी है प्रीफेक्ट।





checkbox