Как установить класс css метки в объявлении формы django?



Answers

Я нашел этот фрагмент, который может быть хорошим ответом:

Как добавить класс 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, который я все еще слушаю.

edit: может быть связано с унифицированным способом django для обработки требуемого поля, но, похоже, он не вызывает readonly_cssclass_adder . Но я нашел другое и более легкое решение, мой виджет readOnly автоматически превратился в readOnly ctrlHolder

Это дополнение - мой любимый ответ на данный момент:

edit 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>
Question

Я использую 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 в свой шаблон общей формы и добавить классы вручную.

Любая блестящая идея?




Links