2016-06-15 166 views
0

我想更改ModelForm的輸入字段的類/屬性,但是我希望在可能的情況下從模板中完成。通過Django模板循環

下面是我對這個解決方案,使用Django的django-widget-tweaks

<form action="" method="POST" enctype="multipart/form-data"> 
    {% csrf_token %} 

    <div class="form-group"> 
     {{form.title|add_class:"form-control"|attr:"placeholder:Title"|attr:"type:text"}} 
    </div> 

    <div class="form-group"> 
     {{form.description|add_class:"form-control"|attr:"placeholder:Description"}} 
    </div> 

    <div class="form-group"> 
     {{form.author|add_class:"form-control"|attr:"placeholder:Author"}} 
    </div> 

    <div class="form-group"> 
     <input class="btn btn-primary" type="submit" value="Submit" /> 
    </div> 

</form> 

我的問題是,這是不是很乾,我想知道是否有更好的方法來做到這一點。我知道django已經遍歷了表單,但我不確定如何在修改屬性的同時集成它。

任何幫助表示讚賞。

回答

2

您可以佔用佔位符並將其存儲在字段的help_text field內。有了這樣的方式,你可以很容易地通過像這樣的領域循環:

{% for field in form %} 
<div class="form-group"> 
    {{ field|add_class:"form-control"|attr:field.help_text }} 
</div> 
{% endfor %} 

不幸的是,很難/不可能使用過濾器作爲第二個參數,所以你需要設置help_text'placeholder:%s'其中%s是你想要的價值。


如果您使用的是常規的形式,然後在構造函數中設置help_text。但是,如果你正在使用模型的形式,我認爲這將是最好創建一個新的模板標籤,可以從外地標題創建'placeholder:%s'字符串爲您提供:

@register.assignment_tag 
def get_placeholder_arg(field): 
    return 'placeholder:%s' % field.label 

那麼你的代碼是這樣的:

{% for field in form %} 
{% get_placeholder_arg field as arg %} 
<div class="form-group"> 
    {{ field|add_class:"form-control"|attr:arg }} 
</div> 
{% endfor %} 

有關詳細信息,請參見the django documentation on custom template tags

+0

類型字段用於測試,我不需要它,並且解決方案看起來非常好,我只是好奇於如何將字符串傳遞給幫助文本?如果可能,我想從模板中控制它,所以通過查看模板可以清除所有前端屬性 – Satchel

+0

更新了答案。在django中,如果不使用標籤,你不能在模板中設置變量。希望這可以幫助。 – Anonymous

+0

完美,這就是我正在尋找的!謝謝! – Satchel