2009-10-20 7 views
6

किसी बिंदु पर मुझे "disabled" प्रदर्शित करने की आवश्यकता है (disabled="disabled" विशेषता द्वारा ग्रिड आउट) "select" प्रकार का इनपुट। जैसा कि मानक (xhtml और html4) में निर्दिष्ट है, "select" के इनपुट "readonly" विशेषता नहीं हो सकते हैं। ध्यान दें कि यह केवल प्रस्तुति उद्देश्यों के लिए है, वास्तविक मूल्य POST में समाप्त होना चाहिए। तो यहाँ मैं क्या कर (Django में प्रपत्र घोषणा का एक हिस्सा के हवाले से) है:डीजेगो फॉर्म: सत्यापन के बीच एक अक्षम क्षेत्र बना रहता है

from django import forms 

_choices = ['to be', 'not to be'] 
class SomeForm(forms.Form): 
    field = forms.ChoiceField(choices=[(item, item) for item in _choices], 
        widget=forms.HiddenInput()) # the real field 

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted 
         choices=[(item, item) for item in _choices], 
         label="The question", 
         widget=forms.Select(attrs={'disabled':'disabled'})) 

तो यह इस तरह आरंभ नहीं हो जाता:

initial_val = 'to be' 
form = SomeForm(ititial={'field':initial_val, 
         'mock_field':initial_val}) 

और सब कुछ ठीक है। खैर, जब तक फॉर्म मान्य नहीं हो जाता है और अन्य फ़ील्ड में से एक सत्यापन को विफल करता है। जब ऐसा होता है, तो फॉर्म को पुनः लोड किया जाता है और मान संरक्षित होते हैं, लेकिन "mock_field" में से एक नहीं - यह कभी सबमिट नहीं हुआ (यह अक्षम है)। तो यह संरक्षित नहीं है। हालांकि यह डेटा अखंडता को प्रभावित नहीं करता है, यह अभी भी प्रस्तुति के अनुसार इतना अच्छा नहीं है।

क्या उस क्षेत्र को संरक्षित करने का कोई तरीका है, जितना संभव हो उतना हैकरी? यह फॉर्म django.contrib.formtools.FormWizard का हिस्सा है और प्रारंभिक मान (और कुछ फ़ील्ड) गतिशील रूप से उत्पन्न होते हैं। असल में, बहुत सारी चीज़ें पहले से चल रही हैं, अगर यह संभव था कि चीजों को खत्म न करें तो यह बहुत अच्छा होगा।

उत्तर

1

ठीक है, यह पहली बार होगा जब मैं अपने प्रश्न का उत्तर दूंगा, लेकिन मुझे एक समाधान मिला है और (जबकि यह cerainly एक हैक है) यह काम करता है।

प्रपत्र उदाहरण से प्रारंभिक मूल्य प्राप्त करने के बजाय, self.fields['whatever'].initial कन्स्ट्रक्टर के अंदर None प्रतीत होता है, मुझे कीवर्ड तर्क "प्रारंभिक" से मूल्य मिल रहा है। और फिर मैंने इसे "नकली" फ़ील्ड के लिए एकमात्र विकल्प के रूप में सेट किया। इस तरह:

from django import forms 

_choices = ['to be', 'not to be'] 
class SomeForm(forms.Form): 
    field = forms.ChoiceField(choices=[(item, item) for item in _choices], 
        widget=forms.HiddenInput()) # the real field 

    mock_field = forms.ChoiceField(required=False, # doesn't get submitted 
         choices=[(item, item) for item in _choices], 
         label="The question", 
         widget=forms.Select(attrs={'disabled':'disabled'})) 

    def __init__(self, *args, **kwargs): 
     super(SomeForm, self).__init__(*args, **kwargs) 
     mock_initial = kwargs['initial']['field'] 
     self.fields['mock_field'].choices = [(mock_initial, mock_initial),] 

शायद इसे कुछ त्रुटि प्रबंधन की आवश्यकता है। जाहिर है, यह वास्तविक काम नहीं करेगा यदि प्रारंभिक मान वास्तविक field के लिए प्रदान नहीं किया गया है।

3

ब्राउज़र अक्षम फ़ील्ड पोस्ट नहीं करते हैं।

आप अपने फार्म के __init__

def __init__(self, *args, **kwargs): 
    super(SomeForm, self).__init__(*args, **kwargs) 
    mock_initial = self.fields['field'].initial 
    self.fields['mock_field'].initial = mock_initial 

संहिता में mock_field को field प्रारंभिक मूल्य कॉपी करने के लिए परीक्षण नहीं किया गया है की कोशिश कर सकते हैं। आम तौर पर आप form.data के बारे में चिंतित होंगे, लेकिन इस मामले में यह initial

+0

खैर, मैं, निश्चित रूप से, जानता हूं कि अक्षम फ़ील्ड पोस्ट नहीं किए गए हैं (क्योंकि केवल सफल नियंत्रण पोस्ट किए जाते हैं और अक्षम फ़ील्ड कभी सफल नहीं होते हैं)। मैं अब आपके दृष्टिकोण का परीक्षण करने जा रहा हूं। यह काफी दृढ़ दिखता है। – shylent

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