2012-10-20 14 views
11

मैं निम्नलिखित की तरह मेरे मॉडलों में से एक में एक क्षेत्र है:मॉडलफॉर्म पसंद फ़ील्ड के लिए empty_label कैसे बदलें?

payrollProvider = models.CharField(max_length=2, choices=PAYROLL_CHOICES) 
PAYROLL_CHOICES = (
     ('C1', 'Choice1'), 
     ('C2', 'Choice2') 
     etc..... 
        ) 

जब मैं इस क्षेत्र के लिए एक मॉडल फ़ॉर्म बनाते हैं, Django सही ढंग से एक HTML सलेक्ट बॉक्स उत्पन्न करता है, लेकिन "का एक डिफ़ॉल्ट रिक्त मूल्य शामिल हैं - ------- "।

मैं जानना चाहता हूं कि इस डिफ़ॉल्ट मान को किसी अन्य पाठ में कैसे बदलें, जैसे "कृपया मूल्य चुनें"।

मेरा मानना ​​है कि मैं निम्नलिखित के माध्यम से अपने मॉडल फार्म के init में यह स्थापित करने के लिए सक्षम होना चाहिए, in this answer और कई अन्य दस्तावेज के रूप में:

self.fields['payrollProvider'].empty_label = "please choose value" 

बहरहाल, यह मेरे लिए काम नहीं कर रहा है। जब मैं अपने फॉर्म के init में उस पंक्ति को शामिल करता हूं, तो "--------" अभी भी चयन बॉक्स में प्रारंभिक पसंद के रूप में दिखाई देता है। मैं नीचे प्रासंगिक form.py चिपका रहा हूँ, लेकिन ऐसा लगता है कि दूसरों के पास also been unable to access/modify empty_label है। इस लिंक पर, प्रश्नकर्ता को डिफ़ॉल्ट खाली_लेबल मान (जिसे मैं अपनी विधि के माध्यम से सफलतापूर्वक करने में सक्षम था) को हटा देता हूं, लेकिन मैं वास्तव में क्या करना चाहता हूं प्रदर्शित होने वाले खाली_लेबल को संशोधित करता है।

कोई विचार?

यहाँ forms.py में फार्म के लिए कोड है, empty_label कोड कि डिफ़ॉल्ट बदल रहा है पर सफल नहीं होता है के साथ "----------":

class PayrollCredentialForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(PayrollCredentialForm, self).__init__(*args, **kwargs) 
     self.fields['payrollUsername'].widget.attrs.update({'class' : 'yp-signup'}) 
     self.fields['payrollPassword'].widget.attrs.update({'class' : 'yp-signup'}) 
     self.fields['payrollProvider'].widget.attrs.update({'class' : 'yp-signup'}) 
     self.fields['payrollUsername'].widget.attrs.update({'placeholder' : ' Payroll Username'}) 
     self.fields['payrollPassword'].widget.attrs.update({'placeholder' : ' Payroll Password'}) 
     self.fields['payrollProvider'].empty_label = "please choose value" 


class Meta: 
    model = Company 
    fields = ('payrollProvider', 'payrollUsername', 'payrollPassword') 
    widgets = { 
     'payrollPassword': forms.PasswordInput(), 
    } 

उत्तर

5

समस्या यह है कि आप कुछ है कि चयन के प्रकार के लिए उपलब्ध नहीं है निर्दिष्ट करने के लिए कोशिश कर रहे हैं खेत।

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

https://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

आप एक पिछले प्रश्न यहाँ में भी देख सकते हैं: https://stackoverflow.com/a/740011/1406860

आप कोशिश करते हैं और के रूप में "कृपया मूल्य चुनें" पहले विकल्प जोड़ने के लिए modelform के HTML रद्द कर सकते थे। वैकल्पिक रूप से, आप एक ही काम करने के लिए एक टेम्पलेट फ़िल्टर का उपयोग कर सकते हैं। अंत में, आप PAYROLL_CHOICES को और ("", "कृपया मूल्य चुनें") कर सकते हैं, और यदि आप इसे पेरोल के बिना सबमिट नहीं करना चाहते हैं तो प्रदाता मॉडल के क्षेत्र में फ़ील्ड के लिए खाली = गलत सेट करें।

जेडी

+0

धन्यवाद ! बहुत सराहना की। – CQP

1

केवल ModelChoiceField (ForeignKey फ़ील्ड के लिए जेनरेट किया गया) empty_label पैरामीटर का समर्थन करता है, और उस स्थिति में यह मुश्किल है क्योंकि उन फ़ील्ड आमतौर पर django.forms.models.ModelFormMetaclass द्वारा django.forms.models.modelform_factory पर कॉल के भीतर उत्पन्न होते हैं।

ModelFormMetaclassempty_label प्रदर्शन के रूप में और '' अपने मूल्य के रूप में के साथ सूची में एक और विकल्प जोड़ने के लिए, empty_label परम उपयोग करता है।

आप क्या चाहते करने के लिए सबसे आसान तरीका है बस अपने विकल्पों की सूची पर एक खाली विकल्प जोड़ने के लिए है:

PAYROLL_CHOICES = (
     ('', 'please choose value'), 
     ('C1', 'Choice1'), 
     ('C2', 'Choice2'), 

     etc..... 
        ) 
8

dokkaebi, जो ठीक से काम नहीं करेगा। आप नीचे दिए गए चयन कोड प्राप्त होगा:

<select name="payrollProvider" id="id_payrollProvider"> 
<option value="" selected="selected">---------</option> 
<option value="" selected="selected">please choose value</option> 
<option value="C1">Choice1</option> 
<option value="C2">Choice2</option> 
</select> 

केवल अपेक्षाकृत सुविधाजनक तरीका है कि मेरे दिमाग में आया था के रूप में इस तरह कुछ करने के लिए है:

class PayrollCredentialForm(forms.ModelForm): 
    class Meta: 
     model = Company 
    def __init__(self, *args, **kwargs): 
     super(PayrollCredentialForm, self).__init__(*args, **kwargs) 
     self.fields["payrollProvider"].choices = [("", "please choose value"),] + list(self.fields["payrollProvider"].choices)[1:] 
+1

एक दीवार के खिलाफ मेरे सिर को टक्कर देने के 3 घंटे बाद एक lifesaver। रिक्त लेबल बदलना 1.7 में संभव दिखता है। –

5

वास्तव में, अब (के रूप में की Django1.8 और उच्च) एक empty_label कार्यों के ओवरराइड:

class PayrollCredentialForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(PayrollCredentialForm, self).__init__(*args, **kwargs) 
     self.fields['payrollProvider'].empty_label = 'Please, choose value' 
class PayrollCredentialAdmin(admin.ModelAdmin): 
    list_display = ('payrollProvider_value',) 

    def payrollProvider_value(self, instance): 
     return instance.payrollProvider 
    payrollProvider_value.empty_value_display = 'Empty value' 

readonly क्या होगा यदि क्षेत्र होना चाहिए:इसके अलावा, अगर आप Django व्यवस्थापक के साथ काम करने, वहाँ एक सूची दृश्य के लिए खाली मान सेट करने के लिए एक विकल्प है?

इस तरह से क्षेत्र में संशोधित क्षेत्र readonly होना चाहिए तो एक पकड़ है।

अधिरोहित फॉर्म फील्ड PayrollCredentialAdmin वर्ग के अंदर readonly_fields विशेषता में निर्दिष्ट किया जाएगा, तो यह PayrollCredentialForm में KeyError अपवाद में परिणाम होगा (readonly क्योंकि क्षेत्र प्रपत्र के self.fields में शामिल नहीं किया जाएगा)। कि संभाल करने के लिए, यह बजाय readonly_fields का उपयोग करने का formfield_for_dbfield ओवरराइड करने के लिए आवश्यक है:

def formfield_for_dbfield(self, db_field, **kwargs): 
    field = super(PayrollCredentialAdmin, self).formfield_for_dbfield(
     db_field, **kwargs 
    ) 
    db_fieldname = canonical_fieldname(db_field) 

    if db_fieldname == 'payrollProvider': 
     field.widget = forms.Select(attrs={ 
      'readonly': True, 'disabled': 'disabled', 
     }) 

    return field 

उपयोगी हो सकता है। लाया धारणा नीचे

टिप्पणियाँ कि इस तरह के ओवरराइड नहीं रह Django के नए संस्करण के लिए मान्य है:


Django1.11 के लिए अद्यतन।

+0

django पर मेरे लिए काम नहीं करता 1.9.7 – Julian

+0

अजीब, यह मेरे लिए Django 1.9 पर काम करता है (हालांकि विशेष रूप से 1.9.7 परीक्षण नहीं किया गया)। उपवासों ने पुष्टि की कि यह एक कामकाजी समाधान है। शायद आपने कोड में कहीं गलती की है? – Nevertheless

+0

क्या आप संपीड़न के लिए पूरा फॉर्म (आपके द्वारा उपयोग किए गए क्षेत्र सहित) पोस्ट कर सकते हैं? मैंने इसे खाली विकल्प जोड़ने पर हल किया लेकिन यह बहुत परेशान है क्योंकि मॉडलचॉइस में वह विकल्प है (और यह काम करता है) – Julian

1

अपने forms.py फ़ाइल में यह निश्चित रूप से काम करेगा .. इस प्रयास करें ...

 class Meta: 
     model = StaffDetails 
     fields =['photo','email', 'first_name','school','department', 'middle_name','last_name','gender', 'is_active'] 
    def __init__(self, *args, **kwargs): 
     super(StaffDetailsForm, self).__init__(*args, **kwargs) 
     self.fields['Field_name'].empty_label = 'Please Select' 

यह मेरे लिए काम किया .. बस तुम्हारा साथ क्षेत्र नामों को बदल ...

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