Django的 - 如何添加HTML属性对模板
问题描述:
形式假设我有以下模板: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原则,我希望设计师能够提高模板我不要做到这一点的表单模型,但在模板本身。
我在文档上找不到任何关于此的内容。有没有办法在模板上做到这一点?
答
我已经成功地编写一个简单的解决我的问题:
我写了一个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" }}
答
我不知道任何其他方式在平原Django。像form.field
或form.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)