Переопределение стандартных виджетов Django

Всем привет! Есть простая Django Form:

class AdminCreationForm(UserCreationForm):
    class Meta:
        model = CustomAdmin
        fields = ('username', 'first_name', 'last_name', 'middle_name', 'email', 'phone_work', 'phone_personal',
              'is_active', 'group')

Которая связана с моделью:

class CustomAdmin(AbstractUser):
    middle_name = models.CharField("Отчество", max_length=150, blank=True)
    phone_work = models.CharField("Рабочий телефон", max_length=64, blank=True)
    phone_personal = models.CharField("Личный телефон", max_length=64, blank=True)
    group = models.ForeignKey('Groups', verbose_name='Группа', on_delete=models.PROTECT, null=True)

Соответственно так же есть View для регистрации нового пользователя

class AdminSignUpView(CreateView):
    form_class = AdminCreationForm
    success_url = reverse_lazy('home')
    template_name = 'signup.html'
    extra_context = {'title': 'Регистрация администратора',
                     'card_title': 'Регистрация нового администратора облака'
                     }

ну и шаблон для этого дела:

{% for field in form %}
<div class="form-group">
    {{ field.errors }}
    {{ field.label_tag }} {{ field }}
    {% if field.help_text %}
        <small class="form-text text-muted">{{ field.help_text|safe }}</small>
    {% endif %}
</div>{% endfor %}

таким образом получается вывод стандартных виджетов предоставляемых самой Django, но мне бы хотелось переопределить их на свои виджеты (или хотя бы на свои шаблоны виджетов). Я знаю что это можно переопределить при написании формы, примерно так:

class UserForm(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={"class":"myfield"}))
    # или так:
    age = forms.IntegerField(widget=MyNumberInput)

Но тут возникает проблема в том, что появляется необходимость в каждой форме переопределять поля вручную, есть ли способ сделать так что бы на моих формах отрисовывались мои версии виджетов без явного их указания (может как-то переунаследоваться от ModelForm и заставить рендерить поля используя собственные виджеты)?

Короче говоря, не уверен, что это на 100% правильный способ, но он работает как мне надо:

В Settings.py добавляем (это не я придумал, нашел на просторах статью):

INSTALLED_APPS = [
...
'django.forms',
...
]
FORM_RENDERER = 'django.forms.renderers.TemplatesSetting'

делаем наследника от ModelForm и переопределяем init:

class AdminCreationForm(forms.ModelForm):    
    def __init__(self, *args, user=None, **kwargs):
        super().__init__(*args, **kwargs)
        if self.fields['last_name'].widget.__class__ == forms.TextInput: # проверяем нужный класс виджета
            self.fields['last_name'].widget.template_name = 'widgets/text_input.html' # переопределяем шаблон виджета на собственный

Может кому-нибудь пригодиться.

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