Понимание Django Forms

Я пытаюсь изучить разработку веб-сайтов на стороне сервера. В частности, я изучаю формы и получение пользовательских данных. Я пытаюсь изучить Django, но я не уверен в своем понимании процесса работы с формами Django.

Правильно ли следующее? Django forms - это приложение, которое генерирует html-форму. Пользователь на стороне клиента нажимает на кнопку, например, "Sign Up", которая затем запускает сценарий с участием Django forms. Модуль форм сгенерирует html-форму, которая будет включена в http-ответ, отправляемый обратно пользователю. Правильно ли это? Или html и Django формы конфликтуют? То есть мы можем использовать только одну? Я пытался читать документацию, но она не помогает мне понять.

TLDR: Какова схема потока для динамического сайта, где мы генерируем формы с помощью Django?

Основная концепция заключается в следующем: Django формы позволяют вам обрабатывать, обрабатывать и проверять данные, представленные клиентом через HTML-форму.

Теоретически, вам даже не нужны формы. Вы можете проверять данные любым удобным для вас способом. Но формы облегчают работу, поэтому мы их используем.

Правильно ли следующее? Django forms - это приложение, которое генерирует html-форму.

Отчасти верно. Форма в Django предназначена для обработки отправленных данных. Для отображения формы на стороне клиента вы можете написать свою собственную HTML-разметку, если хотите.

конфликтуют ли html и Django формы? То есть, мы можем использовать только одну?

Нет, вы можете представлять форму пользователю как угодно. Вы можете полностью закодировать форму в HTML, а затем на стороне сервера передать данные формы для валидации.


Дополнительные комментарии

Если вы хотите полностью контролировать отображение формы, напишите вручную всю HTML-разметку.

Если форма имеет много полей и макет не слишком сложен, вы сэкономите много времени, просто используя {{ form.as_p }} или перебирая поля формы и рендерингуя их.

Ручное проектирование форм

Пример для формы, разработанной вручную:

<div class="form-group">
    <label>Username</label>
    <input 
        type="text"
        class="form-control {% if form.username.errors %}is-invalid{% endif %}"
        name="username"
        placeholder="Username"
        value="{{ form.username.value }}"
    >
    {% if form.username.errors %}
    <div class="invalid-feedback">{{ form.username.errors[0] }}</div>
    {% endif %}
</div>

Doing it The Django way

Вам придется объявить местодержатель, имя класса и т.д. непосредственно в классе формы.

class LoginForm(forms.Form):
    error_css_class = 'is-invalid'

    username = forms.CharField(
                   max_length=20,
                   widget=forms.TextInput(attrs={'placeholder': 'Username', 'class': 'form-control'})
               )

А затем в шаблонах:

{% for field in form %}
<div class="form-group">
    {{ field.label_tag }}
    {{ field }}
    {% if field.errors %}
    <div class="invalid-feedback">{{ field.errors[0] }}</div>
    {% endif %}
</div>
{% endfor %}
Вернуться на верх