2009-05-12 14 views

उत्तर

58

आप ModelForm में क्षेत्र परिभाषा अधिभावी कर ऐसा कर सकता है:

class MyModelForm(forms.ModelForm): 
    boolfield = forms.TypedChoiceField(
        coerce=lambda x: x == 'True', 
        choices=((False, 'False'), (True, 'True')), 
        widget=forms.RadioSelect 
       ) 

    class Meta: 
     model = MyModel 
+7

दुर्भाग्य से यह काम नहीं किया क्योंकि मजबूर = बूल को एक स्ट्रिंग मान पास किया जा रहा है, न कि बूलियन मान और बूल ("गलत") => सही। तो मुझे स्ट्रिंग मान लेने और बूल में कनवर्ट करने के लिए कस्टम कॉरर्स फ़ंक्शन लिखना पड़ा, फिर यह काम किया। सूचक के लिए धन्यवाद। – dar

+1

वास्तव में अपडेट किया जाना चाहिए, @dar नोट्स के रूप में, यह वास्तव में 'बूल (' गलत ') '=>' True' के बाद से काम नहीं करेगा। –

+0

@ डैनियल, यह काम नहीं करता है, बूल ('गलत') सही –

3

इसके अलावा कि MySQL बूलियन के लिए tinyint का उपयोग करता है, तो सही/गलत याद वास्तव में 1/0 कर रहे हैं। बस के बजाय ints का उपयोग करके संक्षेप

def boolean_coerce(value): 
    # value is received as a unicode string 
    if str(value).lower() in ('1', 'true'): 
     return True 
    elif str(value).lower() in ('0', 'false'): 
     return False 
    return None 
30

थोड़ा संशोधित करना डैनियल Roseman का जवाब है, तो आप bool को ठीक कर सकता है ("गलत") यह सच है समस्या =:: मैं इस विवश फ़ंक्शन का उपयोग किया

class MyModelForm(forms.ModelForm): 
    boolfield = forms.TypedChoiceField(coerce=lambda x: bool(int(x)), 
        choices=((0, 'False'), (1, 'True')), 
        widget=forms.RadioSelect 
       ) 

class Meta: 
    model = MyModel 
+2

यह मेरे संपादन फ़ॉर्म पर काम नहीं कर रहा है। क्षेत्र का वर्तमान मूल्य मॉडल से नहीं खींचा जाता है। मैंने इसके बजाय सिक्योरोड का जवाब इस्तेमाल किया। – Dave

5

यहां एक त्वरित है & गंदा विवश है कि "गलत" के आसपास हो जाता है लैम्ब्डा का उपयोग कर समारोह, -> यह सच है समस्या:

... 
boolfield = forms.TypedChoiceField(coerce=lambda x: x and (x.lower() != 'false'), 
... 
82

Django 1.2 "विजेट" modelforms के लिए मेटा विकल्प जोड़ा गया है:

अपने models.py में, अपने बूलियन क्षेत्र के लिए "विकल्प" निर्दिष्ट करें:

class MyModelForm(forms.ModelForm): 
    class Meta: 
     model = MyModel 
     widgets = { 
      'yes_or_no': forms.RadioSelect 
     } 

:

BOOL_CHOICES = ((True, 'Yes'), (False, 'No')) 

class MyModel(models.Model): 
    yes_or_no = models.BooleanField(choices=BOOL_CHOICES) 

फिर, अपने forms.py में, उस क्षेत्र के लिए RadioSelect विजेट निर्दिष्ट मैंने इसका परीक्षण SQLite डीबी के साथ किया है, जो बूलियन को 1/0 मानों के रूप में भी स्टोर करता है, और ऐसा लगता है कि कस्टम कॉरपोरेशन फ़ंक्शन के बिना ठीक काम करता है।

+4

दूर तक सबसे साफ और सबसे अधिक "Django" y समाधान। धन्यवाद! –

+0

यह बहुत अच्छा है। मैं यह थोड़ा 'django.utils.translation आयात ugettext_lazy से _' के रूप में उपयोग करते हुए और अपडेट करके संशोधित करेगा 'हां' और 'नहीं' के स्थानीयकृत संस्करणों अनुमति देने के लिए' BOOL_CHOICES' होने के लिए: 'BOOL_CHOICES = ((यह सच है, _ ('हां')), (झूठी, _ ('नहीं'))) ' – tatlar

+5

मुझे लगता है कि इसे स्थानीयकृत करने के लिए अतिरिक्त कोड बिंदु से विचलित हो जाएगा। पाठक के लिए एक अभ्यास;) – eternicode

3

जैसा कि @ डैनियल रोज़मन जवाब में समस्या है, बूल ('गलत') -> सच है, इसलिए अब मैंने एक समाधान बनाने के लिए दो उत्तरों को जोड़ दिया है।

def boolean_coerce(value): 
    # value is received as a unicode string 
    if str(value).lower() in ('1', 'true'): 
     return True 
    elif str(value).lower() in ('0', 'false'): 
     return False 
    return None 

class MyModelForm(forms.ModelForm): 
boolfield = forms.TypedChoiceField(coerce= boolean_coerce, 
       choices=((False, 'False'), (True, 'True')), 
       widget=forms.RadioSelect 
      ) 

class Meta: 
    model = MyModel 

अब इस काम करेंगे :)

@ eternicode के जवाब के रूप में
3

एक ही है, लेकिन मॉडल को संशोधित किए बिना:

class MyModelForm(forms.ModelForm): 
    yes_no = forms.RadioSelect(choices=[(True, 'Yes'), (False, 'No')]) 

    class Meta: 
     model = MyModel 
     widgets = {'boolfield': yes_no} 

मैं Django 1.2+

3

एक में यह केवल काम करता है लगता है अन्य समाधान:

from django import forms 
from django.utils.translation import ugettext_lazy as _ 

def RadioBoolean(*args, **kwargs): 
    kwargs.update({ 
     'widget': forms.RadioSelect, 
     'choices': [ 
      ('1', _('yes')), 
      ('0', _('no')), 
     ], 
     'coerce': lambda x: bool(int(x)) if x.isdigit() else False, 
    }) 
    return forms.TypedChoiceField(*args, **kwargs) 
6
class MyModelForm(forms.ModelForm): 
    yes_no = forms.BooleanField(widget=RadioSelect(choices=[(True, 'Yes'), 
                  (False, 'No')])) 
+0

यह उचित जवाब होना चाहिए। –

+0

इस समाधान को सत्यापित करना काम करता है, लेकिन [दस्तावेज़ों में नोट] देखें (https://docs.djangoproject.com/en/1.10/ref/forms/fields/#booleanfield)। आपको फ़ील्ड पर आवश्यक = गलत सेट करने की आवश्यकता है। – grokpot

9

Django 1.6 में, मेरे लिए काम किया है::यहाँ सबसे सरल दृष्टिकोण मैं मिल सकता है (मैं Django 1.5 उपयोग कर रहा हूँ) है,

class EmailSettingsForm(ModelForm): 

    class Meta: 
     model = EmailSetting 
     fields = ['setting'] 
     widgets = {'setting': RadioSelect(choices=[ 
      (True, 'Keep updated with emails.'), 
      (False, 'No, don\'t email me.')    
     ])} 
संबंधित मुद्दे