当前位置: 首页 > 面试题库 >

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

阎德宇
2023-03-14
问题内容

我正在使用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并手动添加类。


问题答案:

我发现此片段可能是一个不错的答案:

如何将CSS类和“ *”添加到必填字段的标签

这是适应我需要的内容(未经测试,完成后我将对其进行编辑):

from django.utils.html import escape

def readonly_cssclass_adder(bound_field, label_content, label_attrs):
    if 'readonly' in bound_field.field.widget.attrs:
        if 'class' in attrs:
            label_attrs['class'] += " readOnly"
        else:
            label_attrs['class'] = "readOnly"
    return label_content, label_attrs


def add_required_label_tag(original_function, tweak_foos=None):
    if not tweak_foos:
        return original_function

    def required_label_tag(self, contents=None, attrs=None):
        contents = contents or escape(self.label)
        if attrs is None:
            attrs = {}
        for foo in tweak_foos:
            contents, attrs = foo(self, contents, attrs)
        return original_function(self, contents, attrs)
    return required_label_tag

def decorate_bound_field():
    from django.forms.forms import BoundField
    BoundField.label_tag = add_required_label_tag(BoundField.label_tag, 
                                           tweak_foos=[readonly_cssclass_adder])

如果您有一个更好的解决方案,而不需要调整所有的BoundField类,我仍在听。

编辑:可能链接到Django统一方式来处理必填字段,但似乎不调用readonly_cssclass_adder。但是我找到了另一个更简单的解决方案,我的readOnly小部件会自动变为readOnly ctrlHolder

此添加是我目前最喜欢的回复:

编辑2:最后我选择的另一种方法是“覆盖” uni_form/field.html不调用BoundField.label_tag 的模板。所以我在这里检查了字段状态。

<label for="{{ field.auto_id }}"{% if field.field.required %}
       class="requiredField{% if field.widget.attrs.readonly %} readOnlyLabel{% endif %}"
       {% else %}{% if field.widget.attrs.readonly %}class="readOnlyLabel"{% endif %}{% endif %}>
    {{ field.label|safe }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %}
</label>


 类似资料:
  • 我想创建一个搜索索引,其中包含我想要以下顺序的结果的属性: 首先,所有以搜索词开头的结果 然后所有包含搜索词的结果 为此,我想使用https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html 但是我的索引设置中已经有一个标记器kuromoji_tokenizer。

  • 问题内容: 我想为单选按钮的选定标签添加样式: HTML: CSS 有什么想法我做错了吗? 问题答案: .radio-toolbar input[type=”radio”] { 首先,您可能想在单选按钮上添加属性。否则,它们不属于同一组,可以检查多个单选按钮。 另外,由于我将标签放置为(单选按钮的)同级标签,因此必须使用和属性将它们关联在一起。

  • 问题内容: 我想为form.ModelChoiceField创建动态标签,我想知道如何做到这一点。我有以下表单类: 默认标签由Profile定义中指定的unicode函数定义。但是,需要动态创建由ModelChoiceField创建的单选按钮的标签。 首先,我认为我可以按照Django文档中的描述简单地覆盖ModelChoiceField。但这会创建静态标签。它允许你定义任何标签,但是一旦做出选择

  • 在Jenkins脚本管道中,您可以像这样设置PATH env变量: 注意这里解释的路径MAVENhttps://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv代码集环境变量: 要设置的环境变量列表,每个变量的形式为VARIABLE=value或VARIABLE=以取消设置其他定义的变量。您还可以使用语法PATH wh

  • 是否有可能在FXML中设置样式表,类似于在HTML中设置样式表?

  • 问题内容: 我想样式如下: forms.py: contact_form.html: 例如,如何设置一个类或ID为subject,email,message以提供外部样式表到? 问题答案: 摘自我的答案: 如何在Django中使用 标记表单字段 要么 要么 以上是对完成所要询问内容的原始问题的代码进行的最简单的更改。如果你在其他地方重复使用表格,也可以避免重复。如果你使用Django的as_tab