[python] Определить класс css в формах django



5 Answers

Ответил на мой вопрос. Вздох

docs.djangoproject.com/en/dev/ref/forms/widgets/…

Я не понимал, что он передан в конструктор виджета.

Question

Предположим, у меня есть форма

class SampleClass(forms.Form):
    name = forms.CharField(max_length=30)
    age = forms.IntegerField()
    django_hacker = forms.BooleanField(required=False)

Есть ли способ определить классы CSS в каждом поле, чтобы затем я мог использовать jQuery на основе класса на моей странице?

Я надеялся, что не придется вручную создавать форму.




Если вы хотите добавить класс в поле формы в шаблон (не в view.py или form.py), например, в тех случаях, когда вы хотите изменить сторонние приложения без переопределения их представлений, затем фильтр шаблонов, как описано в Charlesthk answer очень удобен. Но в этом ответе фильтр шаблонов переопределяет любые существующие классы, которые могут иметь поле.

Я попытался добавить это как редактирование, но было предложено написать новый ответ.

Итак, вот тег шаблона, который соответствует существующим классам поля:

from django import template

register = template.Library()


@register.filter(name='addclass')
def addclass(field, given_class):
    existing_classes = field.field.widget.attrs.get('class', None)
    if existing_classes:
        if existing_classes.find(given_class) == -1:
            # if the given class doesn't exist in the existing classes
            classes = existing_classes + ' ' + given_class
        else:
            classes = existing_classes
    else:
        classes = given_class
    return field.as_widget(attrs={"class": classes})



Если вы хотите, чтобы все поля в форме наследовали определенный класс, вы просто определяете родительский класс, который наследует от forms.ModelForm , а затем наследует от него

class BaseForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BaseForm, self).__init__(*args, **kwargs)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'someClass'


class WhateverForm(BaseForm):
    class Meta:
        model = SomeModel

Это помогло мне автоматически добавить класс 'form-control' во все поля во всех формах моего приложения без добавления репликации кода.




Используйте django-widget-tweaks , он прост в использовании и работает очень хорошо.

В противном случае это можно сделать с помощью настраиваемого фильтра шаблонов.

Учитывая, что вы делаете свою форму таким образом:

<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject }}
    </div>
</form>

form.subject - это экземпляр BoundField который имеет метод as_widget .

вы можете создать собственный фильтр «addcss» в «my_app / templatetags / myfilters.py»

from django import template

register = template.Library()

@register.filter(name='addcss')
def addcss(value, arg):
    css_classes = value.field.widget.attrs.get('class', None).split(' ')
    if css_classes and arg not in css_classes:
        css_classes = '%s %s' % (css_classes, arg)
    return value.as_widget(attrs={'class': css_classes})

И затем примените свой фильтр:

{% load myfilters %}
<form action="/contact/" method="post">
    {{ form.non_field_errors }}
    <div class="fieldWrapper">
        {{ form.subject.errors }}
        <label for="id_subject">Email subject:</label>
        {{ form.subject|addcss:'MyClass' }}
    </div>
</form>

form.subjects будут отображаться с классом класса «MyClass».

Надеюсь, эта помощь.

РЕДАКТИРОВАТЬ

  • Обновить фильтр в соответствии с ответом dimyG

  • Добавить ссылку django-widget-tweak




Вы также можете использовать Django Crispy Forms , это отличный инструмент для определения форм, если вы хотите использовать некоторые CSS-фреймворки, такие как Bootstrap или Foundation. И здесь легко указать классы для полей формы.

Тогда вашему классу формы понравится:

from django import forms

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Submit, Field
from crispy_forms.bootstrap import FormActions

class SampleClass(forms.Form):
    name = forms.CharField(max_length=30)
    age = forms.IntegerField()
    django_hacker = forms.BooleanField(required=False)

    helper = FormHelper()
    helper.form_class = 'your-form-class'
    helper.layout = Layout(
        Field('name', css_class='name-class'),
        Field('age', css_class='age-class'),
        Field('django_hacker', css-class='hacker-class'),
        FormActions(
            Submit('save_changes', 'Save changes'),
        )
    )



Просто добавьте классы в свою форму следующим образом.

class UserLoginForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(
        attrs={
        'class':'form-control',
        'placeholder':'Username'
        }
    ))
    password = forms.CharField(widget=forms.PasswordInput(
        attrs={
        'class':'form-control',
        'placeholder':'Password'
        }
    ))



Related