मैं Django में एक CharField पर एक प्लेसहोल्डर कैसे जोड़ूं?


195

उदाहरण के लिए इसे बहुत ही सरल रूप में लें:

class SearchForm(Form):
    q = forms.CharField(label='search')

यह टेम्पलेट में प्रदान किया गया है:

<input type="text" name="q" id="id_q" />

हालाँकि, मैं placeholderइस क्षेत्र में इस विशेषता को जोड़ना चाहता हूं Searchताकि HTML कुछ इस तरह दिखाई दे:

<input type="text" name="q" id="id_q" placeholder="Search" />

अधिमानतः मैं CharFieldएक डिक्शनरी में प्लेसहोल्डर मान को डिक्शनरी में पास करना चाहूंगा जैसे कि या कुछ और:

q = forms.CharField(label='search', placeholder='Search')

इसे पूरा करने का सबसे अच्छा तरीका क्या होगा?

जवाबों:


281

को देखो विगेट्स प्रलेखन । मूल रूप से ऐसा लगेगा:

q = forms.CharField(label='search', 
                    widget=forms.TextInput(attrs={'placeholder': 'Search'}))

अधिक लेखन, हाँ, लेकिन अलगाव अधिक जटिल मामलों के बेहतर अमूर्तता के लिए अनुमति देता है।

आप अपने उप-वर्ग पर सीधे मैपिंग widgetsवाली विशेषता भी घोषित कर सकते हैं ।<field name> => <widget instance>MetaModelForm


क्या आपको घोषणा forms.TextInputकरने के लिए निर्दिष्ट करने की आवश्यकता है attrs={'placeholder': 'Search'}?
झॉवानीसी

1
@OvedD, मुझे पता है यह पुराना है, लेकिन इस प्रश्न को देखें: stackoverflow.com/questions/4341739/…
NotSimon

1
@OvedD: एक मॉडलफ़ॉर्म के साथ यह करने के लिए मेरा जवाब देखें
हैमिश डाउनर

1
यह बहुत बेवकूफ है कि आपको प्लेसहोल्डर जोड़ने के लिए एक विजेट निर्दिष्ट करना होगा। आपको संपूर्ण विजेट को
देखे

चीनी के लिए, आपको इस तरह के पूर्ववर्ती यू की आवश्यकता है: {'प्लेसहोल्डर': यू '
you

60

एक मॉडलफ़ॉर्म के लिए, आप मेटा क्लास का उपयोग कर सकते हैं:

from django import forms

from .models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'name': forms.TextInput(attrs={'placeholder': 'Name'}),
            'description': forms.Textarea(
                attrs={'placeholder': 'Enter description here'}),
        }

ध्यान दें कि इस स्थिति में आप वर्ग निकाय में फ़ील्ड निर्दिष्ट नहीं कर सकते हैं।
विल एस

यह मेरे लिए सबसे आसान तरीका था - और यह अच्छा था कि अन्य सभी विशेषताओं (अर्थात आवश्यक) को अभी भी स्वचालित रूप से मेरे बिना जोड़ा गया था उन्हें निर्दिष्ट करने के लिए।
JxAxMxIxN

41

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

def __init__(self, *args, **kwargs):
    super(MyForm, self).__init__(*args, **kwargs)
    self.fields['email'].widget.attrs['placeholder'] = self.fields['email'].label or 'email@address.nl'

यह प्लेसहोल्डर को निर्दिष्ट उदाहरण के साथ ModelForms के उदाहरण पर निर्भर करने की भी अनुमति देता है।


7
यह बहुत अच्छा है क्योंकि यह अधिक जटिल वस्तुओं जैसे कि विगेट्स की लंबी तात्कालिक नकल करने से बचता है ModelMultipleChoiceField। धन्यवाद!
मतवाला

1
इसी तरह की भावना:, for f in MyCommentForm.base_fields.values(): f.widget.attrs["placeholder"] = f.labelलेकिन मुझे आपकी रचना पद्धति बेहतर लगती है।
jozxyqk

21

आप इस कोड का उपयोग अपने रूप में प्रत्येक TextInput फ़ील्ड के लिए प्लेसहोल्डर attr जोड़ने के लिए कर सकते हैं। प्लेसहोल्डर्स के लिए टेक्स्ट मॉडल फ़ील्ड लेबल से लिया जाएगा।

class PlaceholderDemoForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(PlaceholderDemoForm, self).__init__(*args, **kwargs)
        for field_name in self.fields:
            field = self.fields.get(field_name)  
            if field:
                if type(field.widget) in (forms.TextInput, forms.DateInput):
                    field.widget = forms.TextInput(attrs={'placeholder': field.label})

    class Meta:
        model = DemoModel

19

बड़ा सवाल है। तीन समाधान हैं जिनके बारे में मुझे पता है:

समाधान # 1

डिफ़ॉल्ट विजेट बदलें।

class SearchForm(forms.Form):  
    q = forms.CharField(
            label='Search',
            widget=forms.TextInput(attrs={'placeholder': 'Search'})
        )

समाधान # 2

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

class SearchForm(forms.Form):  
    q = forms.CharField(label='Search')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['q'].widget.attrs.update({'placeholder': 'Search'})

समाधान # 3

अंत में, यदि आप एक मॉडल फॉर्म के साथ काम कर रहे हैं तो ( पिछले दो समाधानों के अलावा ) आपके पास widgetsआंतरिक Metaवर्ग की विशेषता सेट करके किसी फ़ील्ड के लिए कस्टम विजेट निर्दिष्ट करने का विकल्प है ।

class CommentForm(forms.ModelForm):  
    class Meta:
        model = Comment
        widgets = {
            'body': forms.Textarea(attrs={'cols': 80, 'rows': 20})
        }

1
मैं आपके # 2 के रूप में एक समाधान लिखने वाला था। मैं यह जोड़ना चाहता हूं कि आप सभी क्षेत्रों पर परिचालन को लागू कर सकते हैं self.fields, जैसे:for field_name in self.fields: self.fields[field_name].widget.attrs.update({"placeholder": sth})
अल्बर्टो चिसोले

@AlbertoChiusole हाँ, यदि आप ऐसा करना चाहते हैं, तो आप कर सकते हैं। इस पर ध्यान दिलाने के लिए धन्यवाद।
ड्वेन क्रुक्स

@DwayneCrooks मेरा सुझाव है कि आप cdosborn के समाधान के अनुसार अपने # 3 को अपडेट करें , क्योंकि यह छोटा और अधिक पठनीय है।
मैरियन

1

यह जानना अवांछनीय है कि जब आप अपने प्लेसहोल्डर को ओवरराइड करना चाहते हैं तो किसी विजेट को कैसे इंस्टेंट किया जाए।

    q = forms.CharField(label='search')
    ...
    q.widget.attrs['placeholder'] = "Search"

0

अधिकांश समय मैं सिर्फ अपने मॉडल में परिभाषित क्षेत्र के क्रिया नाम के बराबर सभी प्लेसहोल्डर्स की इच्छा रखता हूं

मैंने आसानी से इसे बनाने के लिए एक मिश्रण मिलाया है जो मैं बनाता हूं,

class ProductForm(PlaceholderMixin, ModelForm):
    class Meta:
        model = Product
        fields = ('name', 'description', 'location', 'store')

तथा

class PlaceholderMixin:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs):
        field_names = [field_name for field_name, _ in self.fields.items()]
        for field_name in field_names:
            field = self.fields.get(field_name)
            field.widget.attrs.update({'placeholder': field.label})

-2

आपकी विधि को देखने के बाद, मैंने इसे हल करने के लिए इस विधि का उपयोग किया।

class Register(forms.Form):
    username = forms.CharField(label='用户名', max_length=32)
    email = forms.EmailField(label='邮箱', max_length=64)
    password = forms.CharField(label="密码", min_length=6, max_length=16)
    captcha = forms.CharField(label="验证码", max_length=4)

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    for field_name in self.fields:
        field = self.fields.get(field_name)
        self.fields[field_name].widget.attrs.update({
            "placeholder": field.label,
            'class': "input-control"
        })

2
कृपया ध्यान दें कि स्टैक ओवरफ्लो पर सामग्री अंग्रेजी में होनी चाहिए। इसके अलावा, यह एक "मुझे भी" पद प्रतीत होता है, न कि ऊपर दिए गए प्रश्न के उत्तर के बजाय।
14

मैं कहूंगा कि "मुझे भी" पोस्ट ठीक हैं यदि वे अधिक विवरण जोड़ते हैं। इस दृष्टिकोण के बारे में क्या दूसरों में से किसी के लिए अलग है? यहां तकनीक या आवश्यक सीखने क्या है?
रोकें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.