В Django UserCreationForm отображается только первый плейсхолдер

Я пытаюсь сделать страницу регистрации с настраиваемой формой создания пользователя - добавить заполнители в поля. Я пытаюсь сделать это следующим образом:

forms.py

class SignUpForm(UserCreationForm):
    email = EmailField(max_length=200)

    class Meta:
        model = User
        fields = UserCreationForm.Meta.fields + ("password1", "password2", "email")
        widgets = {
            'username': TextInput(attrs={'placeholder': 'Username'}),
            'email': EmailInput(attrs={'placeholder': 'Email'}),
            'password1': PasswordInput(attrs={'placeholder': 'Password'}),
            'password2': PasswordInput(attrs={'placeholder': 'Repeat password'}),
        }

Однако это влияет только на заполнители имени пользователя - остальные не затрагиваются.

Я попробовал добавить заполнитель в объявление переменной email, и это сработало. Однако должен быть более простой способ сделать это, и даже если я сделаю это, пароли все равно не будут содержать заполнителей. Я также пытался сделать поля переменными, например email = CharField(TextInput(attrs{'placeholder': 'Email'}), но это тоже не помогло.

Попробовал сделать как в теме "Добавление placeholder в UserCreationForm в Django", но это ничего не изменило. В других потоках тоже, возможно, это связано с версией Django. Каждый раз, прежде чем пробовать, я удаляю данные о просмотре сайта, чтобы убедиться, что это не проблема на стороне клиента.

Я использую Django 5.0.6.

В Django для ModelForm можно переопределить виджеты с помощью Meta.widgets только для полей модели.

В вашем случае в форме есть только одно поле модели - username. Остальные поля не являются полями модели, поле email тоже, потому что оно переопределено в форме.

Самый простой и быстрый способ - переопределить метод render:

class SignUpForm(UserCreationForm):
    ... # your code without changes
    class Meta:
        ... # your code without changes
        widgets = {
        ...# your code without changes
        }

    def render(self, *args, **kwargs):
        for name, widget in self._meta.widgets.items():
            self[name].field.widget.attrs.update(widget.attrs)
        return super().render(*args, **kwargs)

больше здесь: https://docs.djangoproject.com/en/5.0/topics/forms/modelforms/#specifying-widgets-to-use-in-the-form-with-widgets

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