एक Django प्रपत्र फ़ील्ड को एक छिपे हुए फ़ील्ड में बदलें


128

मेरे पास एक Django रूप है RegexField, जो एक सामान्य पाठ इनपुट फ़ील्ड के समान है।

मेरे विचार में, कुछ शर्तों के तहत मैं इसे उपयोगकर्ता से छिपाना चाहता हूं, और फॉर्म को यथासंभव रखने की कोशिश कर रहा हूं। इस फ़ील्ड को फ़ील्ड में बदलने का सबसे अच्छा तरीका क्या है HiddenInput?

मुझे पता है कि मैं इसके साथ क्षेत्र पर विशेषता सेट कर सकता हूं:

form['fieldname'].field.widget.attr['readonly'] = 'readonly'

और मैं इसके साथ वांछित प्रारंभिक मूल्य निर्धारित कर सकता हूं:

form.initial['fieldname'] = 'mydesiredvalue'

हालाँकि, यह विजेट का रूप नहीं बदलेगा।

इस क्षेत्र को एक <input type="hidden">क्षेत्र बनाने के लिए सबसे अच्छा / सबसे "django-y" / less "hacky" तरीका क्या है?

जवाबों:


169

यदि आपके पास एक कस्टम टेम्प्लेट है और देखें तो आप {{ modelform.instance.field }}मान प्राप्त करने के लिए फ़ील्ड और उपयोग को छोड़ सकते हैं ।

यह भी आप दृश्य में उपयोग करना पसंद कर सकते हैं:

form.fields['field_name'].widget = forms.HiddenInput()

लेकिन मुझे यकीन नहीं है कि यह पोस्ट पर बचाने के तरीके की रक्षा करेगा।

आशा करता हूँ की ये काम करेगा।


1
मैं &quot;&quot; is not a valid value for a primary key.इस समाधान का उपयोग करने के बाद is_valid विधि में अंत करता हूं।
जेन्स टिम्मरमैन

सुनने में अजीब लगता है। मुझे लगता है कि यह किसी और चीज से संबंधित है, क्या आप हिडनइनपुट के रूप में प्रदर्शित कर रहे हैं जो आपके द्वारा बनाई जा रही वस्तुओं की प्राथमिक कुंजी है? यदि हाँ, तो आपको नहीं करना चाहिए।
क्रिस्टोफ31

हो सकता है कि यह बिना कहे चला जाए, लेकिन इससे पहले कि यह काम करे, आपको फॉर्म आयात करने की आवश्यकता होगी। from django import forms
तेयुएन

2
1.7 इस सिंटैक्स का उपयोग करें: hidden_field_name = forms.CharField(label='reset', max_length=256, widget=forms.HiddenInput())जहां कुंजी अंत में नया विजेट सिंटैक्स है। अपनी आवश्यकताओं के लिए चिकोटी।
मार्क

195

यह भी उपयोगी हो सकता है: {{ form.field.as_hidden }}


3
यह सबसे अच्छा जवाब है IMHO। फॉर्म फ़ील्ड के प्रदर्शन को निर्धारित करने के लिए मुझे हमेशा अपने "कंट्रोलर" पायथन कोड का उपयोग करने से नफरत है।
trpt4him

मैं अक्सर क्रिस्पीफॉर्म के साथ जेनेरिक फॉर्म टेम्पलेट बनाता हूं। यदि आप क्रिस्पीफ़ॉर्म का उपयोग करते हैं या आप एक साधारण फ़ोरलूप में फ़ील्ड प्रदर्शित करते हैं, क्योंकि आप अपनी फॉर्म क्लास में अपनी फॉर्म संरचना चाहते हैं, तो फॉर्म में ओवरराइड करने वाला विजेट इसे करने का सबसे अच्छा तरीका है। बू यदि आप अपने टेम्प्लेट को अपने टेम्प्लेट में प्रदान करते हैं, तो वास्तव में, यह समाधान अधिक स्पष्ट / स्वच्छ है।
christophe31

यह ध्यान देने योग्य है कि यह आपके द्वारा पहले से लागू किए गए किसी भी वर्ग को मिटाने के लिए लगता है ...
जॉन आरोन

59

एक विकल्प जो मेरे लिए काम करता है, उस क्षेत्र को मूल रूप में परिभाषित करें:

forms.CharField(widget = forms.HiddenInput(), required = False)

फिर जब आप इसे नई कक्षा में ओवरराइड करेंगे तो यह जगह बनाकर रखेगा।


45

सबसे पहले, यदि आप उपयोगकर्ता को डेटा को संशोधित नहीं करना चाहते हैं, तो यह केवल क्षेत्र को बाहर करने के लिए क्लीनर लगता है। इसे एक छिपे हुए क्षेत्र के रूप में शामिल करना बस तार पर भेजने के लिए अधिक डेटा जोड़ता है और दुर्भावनापूर्ण उपयोगकर्ता को इसे संशोधित करने के लिए आमंत्रित करता है जब आप उन्हें नहीं चाहते हैं। यदि आपके पास फ़ील्ड को शामिल करने का एक अच्छा कारण है, लेकिन इसे छिपाते हैं, तो आप मॉडलफॉर्म के कंस्ट्रक्टर के लिए एक कीवर्ड arg पास कर सकते हैं। कुछ इस तरह शायद:

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def __init__(self, *args, **kwargs):
        from django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(MyModelForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['fieldname'].widget = HiddenInput()
            # or alternately:  del self.fields['fieldname']  to remove it from the form altogether.

फिर आपके विचार में:

form = MyModelForm(hide_condition=True)

मैं इस दृष्टिकोण को मॉडलफॉर्म के इंटर्नल्स को देखने के लिए संशोधित करना पसंद करता हूं, लेकिन यह स्वाद की बात है।


11
बस सरल टिप, kwargs.pop ('Hide_condition', गलत) बजाय kwargs ['hide_condition']। आप कोई भी arg केस नहीं संभालेंगे, एक ही समय में एक डिफ़ॉल्ट और डेल है।
क्रिस्टोफ

2
टिप के लिए धन्यवाद, christophe31। मैंने आपके सुझाव के साथ अपडेट किया है, क्योंकि यह कोड को अधिक स्पष्ट बनाता है।
rych

1
क्या इस दृष्टिकोण के साथ क्षेत्र को पूरी तरह से छिपाना संभव है? जैसे अगर आप सेट करते हैं class Meta: exclude = ["fieldname"]। यहाँ समस्या यह है कि मेटा-दृष्टिकोण "स्थिर" है, लेकिन मुझे कुछ गतिशील चाहिए। देखें stackoverflow.com/questions/20243735/…
Themerius

आप कैब डि डिफ __init __ (स्वयं, Hide_condition = True, * args, ** kwargs) जो सबसे साफ तरीका है ...
Visgean Skeloru

22

सामान्य रूप के लिए आप कर सकते हैं

class MyModelForm(forms.ModelForm):
    slug = forms.CharField(widget=forms.HiddenInput())

यदि आपके पास मॉडल फॉर्म है तो आप निम्न कार्य कर सकते हैं

class MyModelForm(forms.ModelForm):
    class Meta:
        model = TagStatus
        fields = ('slug', 'ext')
        widgets = {'slug': forms.HiddenInput()}

आप __init__विधि को ओवरराइड भी कर सकते हैं

class Myform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(Myform, self).__init__(*args, **kwargs)
        self.fields['slug'].widget = forms.HiddenInput()

1

यदि आप चाहते हैं कि फ़ील्ड हमेशा छिपी रहे, तो निम्न का उपयोग करें:

class MyForm(forms.Form):
    hidden_input = forms.CharField(widget=forms.HiddenInput(), initial="value")

0

आप बस सीएसएस का उपयोग कर सकते हैं:

#id_fieldname, label[for="id_fieldname"] {
  position: absolute;
  display: none
}

इससे फ़ील्ड और उसका लेबल अदृश्य हो जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.