Какой самый быстрый способ стилизовать поля формы модели django по одному

У меня есть ModelForm, который успешно рендерится.

это моя forms.py форма

class UploadPostsForm(forms.ModelForm):

    class Meta:
        model = Post
        fields = ['title', 'description', 'date', 'file']

вот как это выглядит в templates

enter image description here

Я хочу, чтобы он выглядел как ниже, используя bootstrap5

enter image description here

какой самый быстрый и простой способ сделать это? Я нашел три способа.

1. добавление пользовательских тегов шаблонов

from django import template

register = template.Library()

@register.filter(name='addclass')
def addclass(value, arg):
    return value.as_widget(attrs={'class': arg})

{% load myfilters %}

<form action="/contact/" method="post">
  {{ form.non_field_errors }}
  <div class="fieldWrapper">
    {{ form.subject.errors }}
    {{ form.subject.label_tag }}
    {{ form.subject|addclass:'MyClass' }}
    <span class="helptext">{{ form.subject.help_text }}</span>
  </div>
</form>

2. определение стилей в каждом поле формы или во всех сразу

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModel
        widgets = {
            'myfield': forms.TextInput(attrs={'class': 'myfieldclass'}),
        }

3. переопределение __init__ метода

        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['myfield'].widget.attrs.update({'class': 'myfieldclass'}) 

как лучше всего это сделать?

django-crispy-forms может решить эту проблему. Он позволит вам контролировать поведение рендеринга ваших Django форм очень элегантным и DRY способом.

Repo: https://github.com/django-crispy-forms/django-crispy-forms.
Простой учебник: https://simpleisbetterthancomplex.com/tutorial/2018/11/28/advanced-form-rendering-with-django-crispy-forms.html

Вернуться на верх