当我定义一个类似于这样的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输入元素在checkbox后面有一个标签,而不是相反。有办法说服Django这么做吗?
[编辑]
感谢Jonas的回答-尽管如此,虽然它修复了我问的问题(复选框标签呈现在复选框的右侧),但它引入了一个新问题(所有小部件标签都呈现在其小部件的右侧)。..)
我想避免覆盖_html_output(),因为它显然不是为它设计的。我提出的设计是在Field类中实现一个字段html输出方法,覆盖布尔字段的方法,并在_html_output()中使用该方法。不幸的是,Django开发人员选择了另一种方式,我希望尽可能在现有的框架内工作。
CSS听起来像是一个不错的方法,只是我不知道足够的CSS来实现这一点,甚至不知道我是否喜欢这种方法。此外,我更喜欢仍然类似于最终输出的标记,至少在呈现顺序上是这样。
此外,由于为任何特定的标记使用多个样式表是合理的,在CSS中这样做可能意味着必须为多种样式执行多次,这几乎使CSS成为错误的答案。
[编辑]
好像我在下面回答自己的问题。如果有人有更好的主意,不要害羞。
8条答案
按热度按时间dgenwo3n1#
这是我提出的一个解决方案(Django v1.1):
您需要创建一个自定义模板标记(在本例中,在“www.example.html”中 www.example.com ”文件),其中包含如下内容:
更多信息自定义模板标签可用here。
编辑:本着asker自己回答的精神:
优点:
1.不要用CSS。
1.标记最终看起来像它应该的样子。
1.我没有黑进 Django 内部。(但不得不看相当多的一堆)
1.模板是好的,紧凑和惯用的。
1.不管标签和输入字段名的确切值如何,过滤器代码都能很好地发挥作用。
缺点:
1.可能有什么东西能做得更好更快。
1.客户不太可能愿意支付所有的时间花在这只是移动标签的权利。..
0md85ypi2#
我从romkyns那里得到了答案,并使它更一般化一点
这样您就可以直接用字符串检查小部件类型
3duebb1j3#
所有提出的解决方案都涉及模板修改,这通常在性能方面相当低效。下面是一个自定义小部件来完成这项工作:
我在一个额外的文件中有 PrettyCheckboxWidget 和 PrettyCheckboxField,所以它们可以在需要的地方导入。如果您不需要翻译,可以删除ugettext部分。此代码在Django 1上运行。5,未对较低版本进行测试。
优点:
缺点:
lyr7nygr4#
我知道用户排除了CSS,但考虑到顶级答案需要大约半个小时的工作来做这样一件小事,但知道像这样的细节在网站上很重要,我会满足于CSS解决方案。
checkbox.css
forms.py
template.html
优点:
form.as_p
)缺点:
egmofgnx5#
这就是我最后做的。我写了一个自定义模板stringfilter来切换标签。现在,我的模板代码看起来像这样:
与普通Django模板的唯一区别是添加了{% load %}模板标签和pretty_checkbox过滤器。
下面是pretty_checkbox的一个实用但丑陋的实现--这段代码没有任何错误处理,它假设Django生成的属性是以一种非常特定的方式格式化的,在你的代码中使用这样的东西是一个坏主意:
pretty_checkbox扫描其字符串参数,查找和标签对,如果标签的类型为“checkbox”,则切换它们。它还剥离了标签的最后一个字符,该字符恰好是':'字符。
优点:
1.不要用CSS。
1.标记最终看起来像它应该的样子。
1.我没有黑进 Django 内部。
1.模板是好的,紧凑和惯用的。
缺点:
1.过滤器代码需要测试标签和输入字段名称的令人兴奋的值。
1.可能有什么东西能做得更好更快。
1.比我计划在周六做的更多的工作。
yks3o0rb6#
在Django admin中更改复选框的位置可能非常棘手,但幸运的是,有一个简单的解决方案,使用自定义小部件:
Django只在widget是
CheckboxInput
的子类时使用左位置czfnxgou7#
输入和标签的顺序通过表单的normal_row参数提供,复选框没有不同的行模式。因此,有两种方法可以做到这一点(在0。96版本:
2.使用CSS更改标签和复选框的位置
ctehm74n8#
我也遇到了这个问题,我只是用了这个方法:
**后详细信息。简体中文