В UserCreationForm Django отображается только первый заполнитель

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

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.

Можете ли вы показать, как вы вызываете свою форму в представлении? Это определенно не ответ, который я даю на ваш вопрос, но я хотел бы увидеть весь объем того, как все отображается, чтобы гарантировать, что нет лучших способов, чем опубликованный текущий (твердый) ответ.

ViaTech 06.07.2024 02:03

Связанный: stackoverflow.com/questions/78685010/…

CoffeeBasedLifeform 06.07.2024 08:01

Конечно, спасибо. Извините, я не подумал об этом во время публикации. Я добавил больше контекста.

Potion 06.07.2024 12:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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

Спасибо. Я добавил функцию переопределения рендеринга в файл форм, но, к сожалению, заполнители не обновились. Должен ли я внести дополнительные изменения в код для нового метода?

Potion 06.07.2024 00:23

если вы визуализируете поля формы вручную - метод рендеринга не вызывается. в этом случае вы можете переопределить init. Можете ли вы предоставить нам свой шаблон?

Maxim Danilov 06.07.2024 10:29

Спасибо, я добавил шаблон, извините, не подумал об этом во время публикации.

Potion 06.07.2024 12:39

Спасибо, я переопределил init, и теперь он работает. Спасибо большое, теперь все работает отлично.

Potion 06.07.2024 12:42

Добро пожаловать. Я так и думал — вы визуализируете поля вручную! Я очень рад, если это сработает. 🤗

Maxim Danilov 06.07.2024 12:50

Другие вопросы по теме