2013-10-21 7 views
24

मैं नीचेवर्ग, आईडी कैसे जोड़ें, प्लेसहोल्डर Django मॉडल में एक क्षेत्र के लिए जिम्मेदार बताते हैं रूपों

models.py

class Product(models.Model): 
    name = models.CharField(max_length = 300) 
    description = models.TextField(max_length = 2000) 
    created = models.DateTimeField(auto_now_add = True) 
    updated = models.DateTimeField(auto_now = True) 

    def __unicode__(self): 
     return self.name 

forms.py

की तरह एक Django मॉडल है
class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

product_form.py (केवल एक उदाहरण)

<form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post"> 
     <div id="name"> 
      {{form.name}} 
     </div> 
     <div id="description"> 
      {{form.description}} 
     </div> 
    </form> 

असल में मैं प्रदर्शित/प्रस्तुत करना चाहता हूँ की तरह एचटीएमएल उत्पादन

नीचे
<input id="common_id_for_inputfields" type="text" placeholder="Name" class="input-calss_name" name="Name"> 

<input id="common_id_for_inputfields" type="text" placeholder="Description" class="input-calss_name" name="description"> 

तो अंत में उपरोक्त कोड में मॉडल प्रपत्र फ़ील्ड्स के लिए गुण (आईडी, प्लेसहोल्डर, वर्ग) जोड़ने के लिए कैसे?

उत्तर

32

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

#forms.py 
class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

    def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) 
     self.fields['description'].widget = TextInput(attrs={ 
      'id': 'myCustomId', 
      'class': 'myCustomClass', 
      'name': 'myCustomName', 
      'placeholder': 'myCustomPlaceholder'}) 
+2

यह मेरे लिए अच्छी तरह से काम सिवाय इसके कि यह मेरी विजेट का चयन से सभी विकल्पों को मिटा दिया। मुझे पता चला कि आप विजेट घोषणा को सभी को एक साथ छोड़ सकते हैं और फिर भी इसकी विशेषताएं सेट कर सकते हैं: 'self.fields [' description ']। विजेट।attrs = { 'आईडी': 'myCustomId', 'क्लास': 'myCustomClass', 'नाम': 'myCustomName', 'प्लेसहोल्डर': 'myCustomPlaceholder'} ' इसके अलावा मेरे लिए थोड़ा क्लीनर लगता है। – bjesus

+0

यदि आप कन्स्ट्रक्टर को ओवरराइड किए बिना सभी रूपों में बूटस्ट्रैप कक्षाएं जोड़ना चाहते हैं तो हर बार मेरा उत्तर नीचे देखें। – hurlbz

24

फील्ड आईडी, Django द्वारा स्वचालित रूप से उत्पन्न किया जाना चाहिए अन्य क्षेत्रों ओवरराइड करने के लिए:

class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     exclude = ('updated', 'created') 

    def __init__(self, *args, **kwargs): 
     super(ProductForm, self).__init__(*args, **kwargs) 
     self.fields['name'].widget.attrs\ 
      .update({ 
       'placeholder': 'Name', 
       'class': 'input-calss_name' 
      }) 
+0

क्या आईडी वास्तव में स्वचालित रूप से जेनरेट की जानी चाहिए? आप आईडी को ओवरराइड भी कर सकते हैं। –

+0

आप आईडी को भी ओवरराइड कर सकते हैं (जैसा कि मैंने आपको दिखाया है, आप किसी भी विशेषता को ओवरराइड कर सकते हैं), लेकिन मुझे लगता है कि डीजेंगो जेनरेटेड आईडी का उपयोग करना बेहतर है, जब तक कि आप पर कोई नियंत्रण न हो (जैसे कि जब आप तृतीय पक्ष जेएस का उपयोग करते हैं पुस्तकालय या smth ..) – mariodev

+0

'form.fields' ??? यह 'self.fields' होना चाहिए – suhailvs

11

आप नीचे दिए गए के रूप में forms.py अद्यतन कर सकते हैं

 class ProductForm(ModelForm): 
      class Meta: 
        model = Product 
        exclude = ('updated', 'created') 
        widgets={ 
         "name":forms.TextInput(attrs={'placeholder':'Name','name':'Name','id':'common_id_for_imputfields','class':'input-class_name'}), 
         "description":forms.TextInput(attrs={'placeholder':'description','name':'description','id':'common_id_for_imputfields','class':'input-class_name'}), 

        } 
1

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

class ProductForm(ModelForm): 
    name = forms.CharField(label='name ', 
      widget=forms.TextInput(attrs={'placeholder': 'name '})) 
3

सभी फ़ॉर्म फ़ील्ड को बूटस्ट्रैप वर्ग को जोड़ने, तो मैं प्रत्येक क्षेत्र के लिए मैन्युअल रूप इनपुट विगेट्स फिर से बनाने की जरूरत नहीं है उत्कृष्ट mariodev जवाब का थोड़ा संशोधित संस्करण, (लघु अजगर 3.x सुपर()):

class ProductForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     for field in self.Meta.fields: 
      self.fields[field].widget.attrs.update({ 
       'class': 'form-control' 
      }) 
+2

यह भी काम करता है अगर आप "self.field.fields" के "self.fields" का उपयोग करते हैं। – j4n7

19

मुझे वास्तव में दिमित्री सिंट्सोव के उत्तर पसंद हैं लेकिन यह काम नहीं करता है।

def __init__(self, *args, **kwargs): 
    super().__init__(*args, **kwargs) 
    for field in iter(self.fields): 
     self.fields[field].widget.attrs.update({ 
      'class': 'form-control' 
    }) 
+0

यह हर बार पूरे विजेट को बनाने से कहीं ज्यादा बेहतर है। मैंने एक क्लास बेसिकफॉर्म बनाया जो फॉर्मों को बढ़ाता है। मॉडेलफॉर्म जो यह करता है। मैं सिर्फ मॉडल फॉर्म के बजाय बेसिकफॉर्म का विस्तार करता हूं और स्वचालित रूप से सभी रूपों पर बूटस्ट्रैप कक्षाएं प्राप्त करता हूं। मैं एक कदम आगे गया और कक्षाओं को किसी भी कस्टम सीएसएस कक्षाओं में जोड़ना जो पहले से ही हो सकता है। कोड उदाहरण के लिए मेरा जवाब देखें। – hurlbz

3

Derick हेस से जवाब देने के लिए जोड़ा जा रहा है मैं एक वर्ग BasicForm जो forms.ModelForm कि हर रूप है कि यह फैली करने के लिए बूटस्ट्रैप वर्गों कहते फैली बनाया: यहाँ एक संस्करण है कि काम करता है।

मेरे रूपों के लिए मैं मॉडल फॉर्म के बजाय बेसिकफॉर्म का विस्तार करता हूं और स्वचालित रूप से सभी रूपों पर बूटस्ट्रैप कक्षाएं प्राप्त करता हूं। मैं एक कदम आगे गया और कक्षाओं को किसी भी कस्टम सीएसएस कक्षाओं में जोड़ना जो पहले से ही हो सकता है।

class BaseModelForm(forms.ModelForm): 

def __init__(self, *args, **kwargs): 
    super(BaseModelForm, self).__init__(*args, **kwargs) 
    # add common css classes to all widgets 
    for field in iter(self.fields): 
     #get current classes from Meta 
     classes = self.fields[field].widget.attrs.get("class") 
     if classes is not None: 
      classes += " form-control" 
     else: 
      classes = "form-control" 
     self.fields[field].widget.attrs.update({ 
      'class': classes 
     }) 
1

क्षेत्र बनाने के लिए एक CSS वर्ग को जोड़ने के लिए add_class फिल्टर:

{% load widget_tweaks %}  
    <form enctype="multipart/form-data" action="{% url 'add_a_product' %}" method="post"> 
       <div id="name"> 
        {{form.name|add_class:"input-calss_name"}} 
       </div> 
       <div id="description"> 
        {{form.description|add_class:"input-calss_name"}} 
       </div> 
      </form> 

django-widget-tweaks library

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