Я пытаюсь создать страницу регистрации с настраиваемой формой создания пользователя - добавьте заполнители в поля. Я пытаюсь сделать это следующим образом:
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'}),
}
views.py
def signup(request):
if request.method == "POST":
form = SignUpForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return HttpResponseRedirect(reverse("event:list"))
else:
form = SignUpForm()
return render(request, "registration/signup.html", {"form": form})
signup.html
{% extends "base.html" %}
{% block signup %}class = "active"{% endblock %}
{% block content %}
<form method = "post">
{% csrf_token %}
<div class = "form-group">
{{ form.username }}
</div>
<div class = "form-group">
{{ form.email }}
</div>
<div class = "form-group">
{{ form.password1 }}
</div>
<div class = "form-group">
{{ form.password2 }}
</div>
<button type = "submit">Sign up</button>
</form>
{% endblock %}
Однако это влияет только на заполнители имени пользователя — остальные не затрагиваются.
Я попробовал добавить заполнитель в объявление переменной электронной почты, и это работает. Однако должен быть более простой способ сделать это, и даже если бы я это сделал, в паролях все равно не было бы заполнителей. Я также попытался сделать поля переменными, например
email = CharField(TextInput(attrs{'placeholder': 'Email'})
, но и это не помогло.
Пробовал сделать это, как в теме «Добавление заполнителя в UserCreationForm в Django», но это ничего не изменило. Другие темы тоже, вероятно, из-за версии Django. Каждый раз перед тем, как попробовать, я удаляю данные просмотра сайта, чтобы убедиться, что это не проблема на стороне клиента.
Я использую Джанго 5.0.6.
Связанный: stackoverflow.com/questions/78685010/…
Конечно, спасибо. Извините, я не подумал об этом во время публикации. Я добавил больше контекста.
В Django для ModelForm
вы можете переопределять виджеты с помощью Meta.widgets
только для полей модели.
В вашем случае в форме только одно поле модели — username
. Остальные поля не являются полями модели, в том числе и поле email
, поскольку оно переопределено в форме.
Самый простой и быстрый способ — переопределить метод рендеринга:
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
Спасибо. Я добавил функцию переопределения рендеринга в файл форм, но, к сожалению, заполнители не обновились. Должен ли я внести дополнительные изменения в код для нового метода?
если вы визуализируете поля формы вручную - метод рендеринга не вызывается. в этом случае вы можете переопределить init. Можете ли вы предоставить нам свой шаблон?
Спасибо, я добавил шаблон, извините, не подумал об этом во время публикации.
Спасибо, я переопределил init, и теперь он работает. Спасибо большое, теперь все работает отлично.
Добро пожаловать. Я так и думал — вы визуализируете поля вручную! Я очень рад, если это сработает. 🤗
Можете ли вы показать, как вы вызываете свою форму в представлении? Это определенно не ответ, который я даю на ваш вопрос, но я хотел бы увидеть весь объем того, как все отображается, чтобы гарантировать, что нет лучших способов, чем опубликованный текущий (твердый) ответ.