2011-02-09 66 views
5

形式假設我有以下模板:Django的 - 如何添加HTML屬性對模板

<div id="openid_input_area"> 
{{ form.openid_identifier }} 
    <input name="bsignin" type="submit" value="{% trans "Sign in" %}"> 
</div> 

我如何添加一個CSS類form.openid_identifier?

由於我秉承SOC原則,我希望設計師能夠提高模板我要做到這一點的表單模型,但在模板本身。

我在文檔上找不到任何關於此的內容。有沒有辦法在模板上做到這一點?

回答

16

我已經成功地編寫一個簡單的解決我的問題:

我寫了一個custom template tag

from django import template 

register = template.Library() 

def htmlattributes(value, arg): 
    attrs = value.field.widget.attrs 


    data = arg.replace(' ', '') 

    kvs = data.split(',') 

    for string in kvs: 
     kv = string.split(':') 
     attrs[kv[0]] = kv[1] 

    rendered = str(value) 

    return rendered 

register.filter('htmlattributes', htmlattributes) 

和所有我在做模板是:

{{ form.openid_identifier|htmlattributes:"class : something, id: openid_identifier" }} 
2

我不知道任何其他方式在平原Django。像form.fieldform.as_p這樣的快捷方式確實可以幫助您入門,但最終可以使用純html。我就是這麼看的。並不是說沒有必要對渲染進行更多的控制。我記得在Django郵件列表上閱讀this discussion about form rendering

Simon Willison是/正在爲圖書館工作,讓設計師有更多的控制權,你可以找到它的來源on github。它有點老,所以它可能不再工作了。而對於你的問題,這個例子看起來可能是你有幫助:

{% field form.name class="myclass" %} 
<!-- renders as --> 
<input type="text" name="name" id="id_name" class="myclass"> 

其實這個功能應該是很容易實現的。您需要一個接受表單字段的模板標記,更新小部件屬性(您可以在表單上設置的屬性)並呈現該字段。

在窗體上迭代會生成BoundField的實例,該實例使用其__unicode__方法呈現自身。您需要將所有關鍵字參數傳遞給小部件渲染函數。這種想法的草案:

@register.simple_tag 
def field(boundfield, **kwargs): 
    if self.field.show_hidden_initial: 
     return self.as_widget(attrs=kwargs) + self.as_hidden(only_initial=True) 
    return self.as_widget(attrs=kwargs)