Работа стандартного кода представления, формы и шаблона Django для обновления модели
Я пытаюсь понять, как на самом деле работает очень регулярно используемая форма кода в Django views.py. Я часто встречаю следующее (или его разновидность), но я не могу найти построчное объяснение того, как работает код - что мне нужно, если я хочу уверенно использовать его и изменять при необходимости.
Я начну с модели, затем представлю urls.py представление и форму. Я пройдусь по соответствующим частям кода. Я рассмотрю:
Модель:
#models.py
class CC_Questions(models.Model):
# defining choices in Model : https://docs.djangoproject.com/en/4.0/ref/models/fields/
personality = [
('IF','IF'),
('IT','IT'),
('EF','EF'),
('ET','ET'),
]
q_text = models.CharField('Question text', max_length=200)
#C1_Type = models.CharField('Choice 1 Type', max_length=2)
C1_Type = models.CharField(choices=personality, max_length=2)
Choice1_text = models.CharField('Choice 1 text', max_length=100)
#C2_Type = models.CharField('Choice 2 Type', max_length=2)
C2_Type = models.CharField(choices=personality, max_length=2)
Choice2_text = models.CharField('Choice 2 text', max_length=100)
#
def __str__(self):
return self.q_text[:20]
Урл
#
#urls.py
app_name = ‘polls’
urlpatterns = [
…..
# ex: /polls/p2create
path('p2create/', p2_views.p2create, name='p2create'),
…
Вид:
#views.py
from.forms import Anyform
#
def p2create(request):
if request.method == 'POST':
form = AnyForm(request.POST)
if form.is_valid():
form.save()
return redirect('/polls/p2')
else:
form = AnyForm()
context = {'form' : form}
return render(request, 'pollapp2/create.html', context)
#
Форма:
#forms.py
#
….
from django import forms
from .models import ….. CC_Questions …
…….
class AnyForm(forms.ModelForm):
class Meta:
model = CC_Questions
fields = ['q_text', 'Choice1_text', 'Choice2_text','C1_Type','C2_Type']
Шаблон:
#
# Create.html
#
…..
{% load widget_tweaks %}
…..
<form method="POST">
{% csrf_token %}
…
<div class="row">
<div class="col-lg-5">
<div class="form-group">
<label for="Choice1_text ">Choice 1</label>
{% render_field form.Choice1_text class="form-control" %}
<label for="C1_type">Type 1</label>
{% render_field form.C1_Type class="form-control" %}
…….
Работает ли код следующим образом? Пользователь вводит url в браузере: http://localhost:8000/polls/p2create/. urls.py выбирает представление для выполнения
path('p2create/', p2_views.p2create, name='p2create'),
views.py запускает представление:
def p2create(request):
Теперь, поскольку ни одна форма еще не была "идентифицирована" или "загружена" (??), следующий тест не работает:
if request.method == 'POST':
поэтому выполняется предложение Else
else:
form = AnyForm()
что "устанавливает" переменную form в "AnyForm()"
Следующая строка создает словарь с именем context, который создает ключ 'form', связанный со значением form (=Anyform)
context = {'form' : form}
Следующая строка ищет файл create.html в каталоге шаблонов, передавая каталог context в качестве параметра
return render(request, 'pollapp2/create.html', context)
Затем шаблон create.html отображает различные поля ввода (??) из :
<label for="Choice1_text ">Choice 1</label>
{% render_field form.Choice1_text class="form-control" %}
Когда на отображаемой странице нажимается кнопка submit, это "передает обратно" (??) значения {% render_field ... %} в представление (?????)
<form method="POST">
...
<div class="col-lg-4">
<button type="submit" class="btn btn-info">Submit</button>
</div>
...
</form>
представление выполняется снова (????), но на этот раз метод запроса установлен на "POST" из-за form method="POST" в шаблоне (?????)
if request.method == 'POST':
Теперь та же форма, AnyForm, "перезагружается" (????), но со значением параметра "POST"
if request.method == 'POST':
form = AnyForm(request.POST)
Теперь, если форма действительна (я понятия не имею, что такое "действительная" или "недействительная" форма)
if form.is_valid():
тогда все значения, "захваченные" в шаблоне по (???)
<label for="Choice1_text ">Choice 1</label>
{% render_field form.Choice1_text class="form-control" %}
(??????)
пишутся по представлению (?????)
form.save
на соответствующие поля в ModelForm (?????)
class Meta:
model = CC_Questions
fields = ['q_text', 'Choice1_text', 'Choice2_text','C1_Type','C2_Type']
Затем представление перенаправляется и загружает домашнюю страницу в браузере
return redirect('/polls/p2')
Ok, Итак, с помощью ссылок (упомянутых ниже) и предложенного вами рабочего процесса, давайте сначала посмотрим рабочий процесс Django MVT, а затем обратимся к различным вопросам, заданным в промежутке между этим постом.
WebForms с Django MVT вкратце:
- Подготовьте данные нескольких различных типов для отображения в форме.
- Рендеринг данных в формате HTML.
- Редактирование, ввод данных с помощью удобного интерфейса.
- Валидация и очистка данных.
- Возврат данных на сервер.
- Сохранить, удалить или передать для дальнейшей обработки.
URL:
Когда пользователь запрашивает страницу с вашего сайта на базе Django, это алгоритм, которому следует система, чтобы определить, какой Python-код выполнить. Этим занимается наш views.py. С фронтенда, если запрос не 'POST', то это GET запрос, следовательно, выполняется else часть функции обработки в views.py. Об этом вы уже говорили.
Вид: - Данные формы, отправленные обратно на сайт Django, обрабатываются представлением, обычно тем же представлением, которое опубликовало форму. Это позволяет нам повторно использовать часть той же логики. Чтобы обработать форму, нам нужно инстанцировать ее в представлении для URL, где мы хотим ее опубликовать.
Если мы используем request.POST, как в этой строке:
form = AnyForm(request.POST)
Он преобразует форму в связанную форму (Form bound with data). Подробнее об этом здесь .
Questioned By You (QBY) - Когда на отображаемой странице нажимается кнопка submit, это "передает обратно" (??) {% render_field .. %} значения в представление (?????)
Итак, да, если атрибут action не указан в форме, то данные будут переданы представлению, ответственному за отображение формы.
QBY - представление выполняется снова (????), но на этот раз метод запроса установлен на "POST" из-за формы method="POST" в шаблоне (?????)
Кнопка типа submit отправляет форму и делает запрос POST-запросом. Шаблон Django отправляет отправленные данные в формате request.POST.
QBY - Теперь та же форма, AnyForm, "перезагружается" (????), но со значением параметра "POST"
Здесь, если метод возврата в конце условия POST - HttpResponseRedirect, то он перенаправит пользователя на указанную URL страницу, но если для рендеринга используется тот же HTML, то форма будет отображаться как связанная форма. (Это зависит от требований)
QBY - Теперь, если форма действительна (я понятия не имею, что такое "действительная" или "недействительная" форма)
Form.is_valid()
Основной задачей объекта Form является проверка данных. При наличии связанного экземпляра Form вызовите метод is_valid(), чтобы запустить проверку и вернуть булево значение, указывающее, были ли данные достоверными. Если да, то данные сохраняются в модели.
QBY - тогда все значения "захвачены" в шаблоне по (???)
Все значения отправляются представлениям в request.POST. Мы можем проверить это по
print(request.POST)
QBY - записываются представлением (?????), form.save в соответствующие поля в ModelForm (?????)
Метод save вызывается на экземпляре Django ModelForm для того, чтобы сохранить данные в базе данных. Вызов метода save запустит проверку валидности. Если данные в форме не подтвердятся, будет вызвана ошибка ValueError.
Эти сохраненные данные теперь могут быть обработаны дальше.
References:
[https://docs.djangoproject.com/en/4.0/topics/forms/][2]
[https://www.tangowithdjango.com/book/chapters/models_templates.html][3]
[https://docs.djangoproject.com/en/4.0/ref/forms/api/][4]