django.forms生成HTML,如何修改Django Form生成表单的样式

井兴怀
2023-12-01

如何修改Django Form生成表单的样式

HIKAI

19 OCT 2017

0 Comments

关于表单样式的修改,有两种方式,前端和后端。后端,可以在定义表单字段时,设定相应widget,比如下面。前端,可以通过django-wddget-tweaks实现。

related = forms.ModelChoiceField(queryset=BlogComment.objects.all(),required=False, widget=forms.HiddenInput)

django-widget-tweaks

第三方django包,用于调整模板渲染后的表单字段样式,而不需要在python-level的表单定义时调整。它支持更改CSS样式表和HTML元素属性。它满足了设计者通过CSS和Javascript定制字段展现的样式,而不用去操作相应的python代码。

安装

pip install django-widget-tweaks

然后在INSTALLED_APPS中添加'widget-tweaks'。

使用

这个应用提供了两组工具,可以一起使用或者单独使用。

1.模板标签render_field,用类似HTML的语法来定制表单字段;

2.一些模板过滤器,用来定制表单字段的HTML属性和CSS样式;

render_field标签应该更容易使用,对于网站设计者和前端开发者来说,更容易去定制表单字段。

相对render_field标签,模板过滤器功能更强大,但是它需要使用或多或少的HTML语法。

render_field

举个例子,

{% load widget_tweaks %}

{% render_field form.search_query type="search" %}

{% render_field form.text rows="20" cols="20" title="Hello, world!" %}

{% render_field form.title class+="css_class_1 css_class_2" %}

{% render_field form.text placeholder=form.text.label %}

可以通过使用WIDGET_ERROR_CLASS和WIDGET_REQUIRED_CLASS模板变量,来设置{%render_field%}渲染的字段的错误和必选的样式表。

{% with WIDGET_ERROR_CLASS='my_error' WIDGET_REQUIRED_CLASS='my_required' %}

{% render_field form.field1 %}

{% render_field form.field2 %}

{% render_field form.field3 %}

{% endwith %}

你可以灵活的使用这些变量:比如,在上下文处理器中对所有通过{%render_field%}渲染的字段设置默认的错误样式表。

过滤器

attr

添加或者替换任何一个表单字段的html属性。

{% load widget_tweaks %}

{{ form.search_query|attr:"type:search" }}

{{ form.text|attr:"rows:20"|attr:"cols:20"|attr:"title:Hello, world!" }}

{{ form.search_query|attr:"autofocus" }}

add_class

给字段元素添加CSS样式。如果一次添加多个样式,通过空格分隔。

{% load widget_tweaks %}

{{ form.title|add_class:"css_class_1 css_class_2" }}

set_data

设置HTML5数据属性(http://ejohn.org/blog/html-5-data-attributes/)。对于javascript非常有用。它是'attr'过滤器的快捷方式,在属性名字前用'data-'字符串装饰。

{% load widget_tweaks %}

{{ form.title|set_data:"filters:OverText" }}

append_attr

给属性值添加额外的数据。

{% load widget_tweaks %}

{{ form.title|append_attr:"class:css_class_1 css_class_2" }}

‘add_class’ filter is just a shortcut for ‘append_attr’ filter that adds values to the ‘class’ attribute.

add_error_class

The same as ‘add_class’ but adds css class only if validation failed for the field (field.errors is not empty).

{% load widget_tweaks %}

{{ form.title|add_error_class:"error-border" }}

add_error_attr

The same as ‘attr’ but sets an attribute only if validation failed for the field (field.errors is not empty). This can be useful when dealing with accessibility:

{% load widget_tweaks %}

{{ form.title|add_error_attr:"aria-invalid:true" }}

field_type and widget_type

'field_type'和'widget_type'是模板过滤器,用来返回字段样式表和字段widget名字。

{% load widget_tweaks %}

{{ field }}

output:

Filter chaining

The order django-widget-tweaks filters apply may seem counter-intuitive (leftmost filter wins):

{{ form.simple|attr:"foo:bar"|attr:"foo:baz" }}

output:

它不是bug,它是一个feature,enables creating reusable templates with overridable defaults.(创建可复用模板覆盖默认值???)。

Reusable field template example:

{# inc/field.html #}

{% load widget_tweaks %}

{{ field|attr:"foo:default_foo" }}

Example usage:

{# my_template.html #}

{% load widget_tweaks %}

{% csrf_token %}

{% include "inc/field.html" with field=form.title %}

{% include "inc/field.html" with field=form.description|attr:"foo:non_default_foo" %}

With 'rightmost filter wins' rule it wouldn't be possible to override |attr:"foo:default_foo" in main template.

其它:

https://stackoverflow.com/questions/5827590/css-styling-in-django-forms

 类似资料: