2013-10-21 53 views
24

我有一個Django模型像下面如何添加類,ID,佔位符屬性,在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

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"> 

所以最後如何在上面的代碼中添加屬性(ID,佔位符,類)模型表單字段的HTML輸出什麼樣的?

回答

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']。widget。ATTRS = { '身份證': 'myCustomId', '類': 'myCustomClass', '名': 'myCustomName', '佔位': 'myCustomPlaceholder'}' 也似乎有點潔淨我。 – bjesus

+0

如果您想將引導程序類添加到所有窗體,而不必每次都重寫構造函數,請參閱下面的答案。 – hurlbz

24

域ID應該自動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

id是否真的應該自動生成?您也可以覆蓋該ID。 –

+0

你也可以重寫id(就像我向你展示的那樣,你可以重寫任何屬性),但我認爲最好使用django生成的id,除非你沒有任何控制權(比如當你使用第三方js時圖書館或水手..) – 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答案稍做修改,添加自舉類的所有窗體字段,所以我不必重新創建手動每個字段表單輸入控件(簡短的Python 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.Meta.fields」中的「self.fields」,它也可以工作。 – j4n7

19

我真的很喜歡Dmitriy Sintsov的回答,但它不起作用。這裏有一個版本是沒​​有問題:我創建了擴展forms.ModelForm,增加了自舉類的每一個擴展它的形式一類BasicForm

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

這比每次構建整個Widget要好得多。我創建了一個類BasicForm,它擴展了forms.ModelForm這個。我只是擴展BasicForm而不是模型表單,並自動獲取所有表單上的引導類。我更進了一步,將類追加到任何可能已存在的自定義css類中。查看我的答案代碼示例。 – hurlbz

3

添加從德里克海耶斯回答。

對於我的表單,我只是擴展BasicForm而不是模型表單,並自動獲取所有表單上的引導類。我更進了一步,將類追加到任何可能已存在的自定義css類中。

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

add_class過濾器添加CSS類來形成場:

{% 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