Переопределение стандартных виджетов 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' # переопределяем шаблон виджета на собственный
Может кому-нибудь пригодиться.