Определить класс CSS в формах Django - PullRequest
173 голосов
/ 30 декабря 2008

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

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

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

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

Ответы [ 13 ]

2 голосов
/ 13 декабря 2016

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

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

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

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})
1 голос
/ 05 марта 2015

Как оказалось, вы можете сделать это в конструкторе формы (функция init ) или после того, как класс формы был инициирован. Это иногда требуется, если вы не пишете свою собственную форму, и эта форма приходит откуда-то еще -

def some_view(request):
    add_css_to_fields = ['list','of','fields']
    if request.method == 'POST':
        form = SomeForm(request.POST)
        if form.is_valid():
            return HttpResponseRedirect('/thanks/')
    else:
        form = SomeForm()

    for key in form.fields.keys():
        if key in add_css_to_fields:
            field = form.fields[key]
            css_addition = 'css_addition '
            css = field.widget.attrs.get('class', '')
            field.widget.attrs['class'] = css_addition + css_classes

    return render(request, 'template_name.html', {'form': form})
0 голосов
/ 21 декабря 2016

Вы также можете использовать 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'),
        )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...