Проблема с заполнением поля формы ввода шаблона django

Я создаю логин пользователя, используя стандартную систему аутентификации django.

Используя шаблон bootstrap, я создаю форму с пользовательскими полями, и они работают правильно.

Проблема в том, что при отображении этой формы, она показывает атрибут value вместо placeholder, который я передал ей.

Вот как это выглядит: страница входа

login.html

    <form method="post" action="{% url 'login' %}"> {% csrf_token %}
      <img class="mb-4" src="{% static 'images/logo.jpg' %}" alt="" width="100" height="100">
      <h1 class="h3 mb-3 fw-normal">Please sign in</h1>

      <div class="form-floating">
        <input type="text" class="form-control" id="floatingInput" placeholder="name@example.com"
          value="{{form.username}}">
        <label for="floatingInput">Username</label>
      </div>
      <div class="form-floating">
        <input type="password" class="form-control" id="floatingPassword" placeholder="Password"
          value="{{form.password}}">
        <label for="floatingPassword">Password</label>
      </div>

      <div class="checkbox mb-3">
        <label>
          <input type="checkbox" value="remember-me"> Remember me &emsp; <a href="{% url 'password_reset' %}">
            Lost password?</a>
        </label>
      </div>
      <button class="w-100 btn btn-lg btn-primary" type="submit">Sign in</button>
      <p class="mt-5 mb-3 text-muted">&copy; 2022 all rights deserved</p>
    </form>

При использовании {{ form.username }} вы отправляете str(form.username) в атрибут value. Метод __str__ в поле формы отображает HTML. Вот почему вы видите то, что видите.

Чтобы исправить это, вы можете поместить {{ form.username.initial }} для отображения начального значения поля.

Совет: попробуйте использовать crispy forms для рендеринга форм. Это намного проще и делает более компактный синтаксис, который зависит от кода формы, а не от HTML. См. https://django-crispy-forms.readthedocs.io/en/latest/

Другое дело, я думаю, что вам не хватает атрибута name для полей ввода. Не уверен, что это работает без него.

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