В 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