当我定义类似如下的Django窗体类时:

def class MyForm(forms.Form):
    check = forms.BooleanField(required=True, label="Check this")

它将展开为如下所示的HTML:

<form action="." id="form" method=POST>
<p><label for="check">Check this:</label> <input type="checkbox" name="check" id="check" /></p>
<p><input type=submit value="Submit"></p>
</form>

我希望checkbox输入元素后面有一个标签,而不是相反.有没有办法说服Django这么做?

[Edit]个个

感谢Jonas的回答-尽管它修复了我询问的问题(复选框标签呈现在复选框的右侧),但也带来了一个新问题(所有窗口小部件标签都呈现在其窗口小部件的右侧……)

我希望避免覆盖_html_output(),因为它显然不是为它设计的.我提出的设计方案是在Field类中实现一个字段html输出方法,覆盖布尔型字段的输出方法,并使用该方法in_html_output().遗憾的是,Django开发人员 Select 了一条不同的道路,我希望尽可能地在现有框架内工作.

CSS听起来是一种不错的方法,只是我对CSS的了解还不够多,无法做到这一点,甚至不能决定我是否喜欢这种方法.此外,我更喜欢仍然与最终输出相似的标记,至少在呈现顺序上是这样.

此外,由于对任何特定标记使用多个样式表是合理的,因此在CSS中这样做可能意味着必须对多个样式执行多次,这在很大程度上使CSS成为错误的答案.

[Edit]个个

看起来我是在回答下面我自己的问题.如果有人有更好的办法,不要害羞.

推荐答案

这就是我最终要做的事.我编写了一个自定义模板字符串过滤器来切换标签.现在,我的模板代码如下所示:

{% load pretty_forms %}
<form action="." method="POST">
{{ form.as_p|pretty_checkbox }}
<p><input type="submit" value="Submit"></p>
</form>

与普通的Django模板唯一的区别是增加了{%load%}模板标记和pretty_checkbox%过滤.

下面是pretty_checkbox的一个功能强大但很难看的实现-此代码没有任何错误处理,它假设Django生成的属性是以一种非常特定的方式格式化的,在您的代码中使用这样的内容不是一个好主意:

from django import template
from django.template.defaultfilters import stringfilter
import logging

register=template.Library()

@register.filter(name='pretty_checkbox')
@stringfilter
def pretty_checkbox(value):
    # Iterate over the HTML fragment, extract <label> and <input> tags, and
    # switch the order of the pairs where the input type is "checkbox".
    scratch = value
    output = ''
    try:
        while True:
            ls = scratch.find('<label')
            if ls > -1:
                le = scratch.find('</label>')
                ins = scratch.find('<input')
                ine = scratch.find('/>', ins)
                # Check whether we're dealing with a checkbox:
                if scratch[ins:ine+2].find(' type="checkbox" ')>-1:
                    # Switch the tags
                    output += scratch[:ls]
                    output += scratch[ins:ine+2]
                    output += scratch[ls:le-1]+scratch[le:le+8]
                else:
                    output += scratch[:ine+2]
                scratch = scratch[ine+2:]
            else:
                output += scratch
                break
    except:
        logging.error("pretty_checkbox caught an exception")
    return output

pretty_checkbox扫描其字符串参数,查找<;label>;和<;input>;标记对,如果<;input>;标记的类型为"CheckBox",则切换它们.它还go 掉了标签的最后一个字符,恰好是‘:’字符.

优势:

  1. 禁止使用CSS进行融合.
  2. 标记最终看起来就像它应该的样子.
  3. 我没有黑进Django 的内部.
  4. 模板美观、紧凑、通俗易懂.

缺点:

  1. 过滤代码需要测试标签和输入字段名称的激动值.
  2. 可能有什么东西能做得更好更快.
  3. 周六的工作比我计划的要多.

Django相关问答推荐

Django项目陷入登录页面

使用FormWizard将信息从视图传递到表单

Django迁移嵌套模型时出错,不带迁移基本模型

Django为不同应用程序发出信号

通过get_form_kwargs将请求传递给Django表单未能使表单访问self.request.user.

按下按钮刷新在html文件中显示的变量

如何使用邮箱确认码创建django注册

在Django测试get方法中获取HttpResponseNotFound

是否可以在 Django 中重命名应用程序的组名?

Django Query 在基于通用类的 UpdateView 中重复了 2 次

相同的字符串不同的翻译

在 Bootstrap 中使单击的选项卡处于活动状态

Django,如何从模型表单的 Select 字段中删除空白 Select ?

将 XML 从 URL 解析为 python 对象

带有 Django 和 Python 的 Atlassian Bamboo - 可能吗?

Django 有 SmallIntegerField 的原因是什么?

如何在 Django/Python 中减go 两个日期?

javascript 文件中的 Django {% static 'path' %}

Django 将多个模型传递给一个模板

判断列表 django 模板中是否存在