gpt4 book ai didi

django - 如何在Django表单声明中设置标签的CSS类?

转载 作者:行者123 更新时间:2023-12-03 14:39:28 25 4
gpt4 key购买 nike

我正在使用django-uniform并使用一些统一功能,我正在寻找一种直接从表单声明中添加css类的方法(对于独立窗口小部件)。

(作为奖励,这里是我可重复使用的只读家庭自制混合片段……)

from django import forms

def _get_cleaner(form, field):
def clean_field():
return getattr(form.instance, field, None)
return clean_field

class UniformROMixin(forms.BaseForm):
"""
UniformROMixin, inherits to turn some fields read only

- read_only = list of field names.
"""

def __init__(self, *args, **kwargs):
super(UniformROMixin, self).__init__(*args, **kwargs)
if hasattr(self, "read_only"):
if self.instance and self.instance.pk:
for field in self.read_only:
self.fields[field].widget.attrs['readonly'] = True
self.fields[field].widget.attrs['class'] += "readOnly"
# here I would like to set css class of the label
# created from the self.fields[field].label string
setattr(self, "clean_" + field, _get_cleaner(self, field))


目前,我唯一的方法是在通用表单模板上添加一些javascript并手动添加类。

有什么好主意吗?

最佳答案

窗口小部件具有attrs关键字参数,该参数带有dict,可以为它呈现的输入元素定义属性。表单还具有一些可以定义的属性,以更改Django显示表单的方式。请看以下示例:

class MyForm(forms.Form):
error_css_class = 'error'
required_css_class = 'required'
my_field = forms.CharField(max_length=10,
widget=forms.TextInput(attrs={'id': 'my_field',
'class': 'my_class'}))

这适用于任何 Widget类。不幸的是,如果您只执行 {{ field }},就没有一种简单的方法来更改Django呈现标签的方式。幸运的是,您在模板中使用了表单对象:
<form>
{% for field in form %}
<label class="my_class" for="{{ field.auto_id }}">{{ field.label }}</label>
{{ field }}
{% endfor %}
<button type="submit">Submit</button>
</form>

再说一遍,您始终可以向正在使用的对象添加任意属性:
# In a view...
form = MyForm()
form.label_classes = ('class_a', 'class_b', )
# Or by hijacking ```__init__```
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
self.my_field = forms.CharField(max_length=10,
widget=forms.TextInput(attrs={'id': 'my_field',
'class': 'my_class'}))
self.my_field.label_classes = ('class_a', 'class_b', )
super(MyForm, self).__init__(*args, **kwargs)

在上下文中使用表单呈现模板,并且可以在模板中执行以下操作:
<form>
{% for field in form %}
<label class="{% for class in field.label_classes %}{{ class }} {% endfor %}"
for="{{ field.auto_id }}">{{ field.label }}</label>
{{ field }}
{% endfor %}
<button type="submit">Submit</button>
</form>

任何适合您的幻想。

关于django - 如何在Django表单声明中设置标签的CSS类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com