2017-08-20 83 views
0

如何正確覆蓋Django模型窗體{{form}}調用中單個項目的樣式。我似乎無法忽略這些虛假行爲,並添加了我的必要風格。如何覆蓋模型表單上的單個項目django

具體來說,我想添加一個簡單的滑塊,通過一些文本到視圖。

class CreateTestForm(forms.ModelForm): 

    difficulty = forms.CharField() 

    class Meta: 
     model = Test 

,並直接在我的HTML如下:

<form method="POST" action=""> {% csrf_token %} 
{{ form|crispy }} 

<strong>Difficulty</strong> 
<input id="difficulty" type="text" value="" class="slider form-control" data-slider-min="0" data-slider-max="10" 
         data-slider-step="1" data-slider-value="[0,10]" data-slider-orientation="horizontal" 
         data-slider-selection="before" data-slider-tooltip="show" data-slider-id="blue"> 
</br> 
<input type='submit' value='Create' class='btn'> 
</form> 

然而,當我呈現的觀點,我得到兩個困難

如下我增加了一個額外的字段,以我的形式輸入(一個滑塊和一個盒子)。我明白,Django正在爲我創建文本框,但我認爲,給我的滑塊相同的ID將簡單地覆蓋它?

從我的觀點來看,我也必須在forms.py類中爲這個表單定義滑塊,否則它不能在視圖中的cleaned_data中訪問。有任何想法嗎?

回答

1

我不知道爲什麼你會這樣認爲。但爲什麼不在表單中首先定義相關屬性,以便自動獲得輸出?

difficulty = forms.CharField(widget=forms.TextInput(attrs={"class": "slider form-control", "data-slider-min": "0"...})) 

甚至更​​好,使用脆皮API,讓你聲明的那些屬性(我不使用脆皮自己,但我知道它給你很多額外的控制。)

1

您可以覆蓋默認的窗口小部件,添加您的類的造型,像這樣:

from django import forms 
class CreateTestform(forms.ModelForm): 
    class Meta: 
     model = Test 
     fields = ['difficulty'] # you don't need to define difficulty again, 
     # just get it from your model like in this example. 
     widget = { 
      'difficulty': forms.CharField(attrs={ 
       'class': 'name-of-your-class', 
       'other-attribute': 'other-value', 
      }), 
     } 

您可以查看更多here

如果你有太多的樣式適用於你的表單,我建議render it manually,我知道你使用cripsy來避免這種情況,但這是一個更簡單的方法,沒有限制,django應該用於後端,而不是前端。

你甚至可以使這樣的(假設你有渲染難度):

<input class="whatever-your-class-is" name="{{ form.difficulty.html_name }}" id="{{ form.difficulty.id_for_label }}"> 

如果你仔細觀察,你發現了大約.html_name.id_for_label,甚至.valuehere信息。