操作标准Django视图、表单和模板代码更新一个模型
Operation of standard Django view, form and template code to update a model
我试图了解 Django views.py 中一个非常常用的代码形式是如何工作的。我看到以下(或变体)使用了很多,但我找不到代码如何工作的逐行解释——如果我要自信地使用它并在需要时修改,我需要它。
如果我理解了 Django 如何处理这些不同的组件,你能告诉我吗?如果不是,请指出我哪里理解错了。
我将从模型开始,然后介绍 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]
url
#
#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" %}
当在显示页面上按下提交按钮时,这会将 {% render_field .. %} 值“传回”(??) 到视图 (?????)
<form method="POST">
...
<div class="col-lg-4">
<button type="submit" class="btn btn-info">Submit</button>
</div>
...
</form>
视图再次执行(????),但这次请求方法设置为“POST”,因为表单方法=“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')
好的,借助参考资料(如下所述)和您建议的工作流程,让我们首先了解 Django MVT 工作流程,然后解决 post 之间提出的各种问题。
带有 Django MVT 的 WebForms 简介:
- 准备几种不同类型的数据以在表格中显示。
- 将数据呈现为 HTML。
- 使用方便的界面编辑、输入数据。
- 验证并清理数据。
- Return 数据到服务器。
- 保存、删除或传递以供进一步处理。
URL:
当用户从您的 Django-powered 站点请求一个页面时,这是系统用来确定执行哪个 Python 代码的算法。这是由我们的 views.py 处理的。从前端来看,如果请求不是 'POST',那么它是一个 GET 请求,因此执行 views.py 中处理函数的 else 部分。这个你已经提到了。
视图:- 发送回 Django 网站的表单数据由视图处理,通常与发布表单的视图相同。这允许我们重用一些相同的逻辑。要处理表单,我们需要在 URL 的视图中实例化它,我们希望它被发布。
如果我们使用request.POST
,如这一行:
form = AnyForm(request.POST)
它将表单转换为绑定表单(Form bound with data)。阅读更多相关信息 here。
您的质疑(QBY) - 当在显示的页面上按下提交按钮时,此“回传”(??) {% render_field .. %}
值到视图 (?????)
所以,是的,如果表单中没有提到 action
属性,那么数据将被传递到负责显示表单的视图。
QBY - 再次执行视图(????),但这次请求方法设置为“POST”,因为模板中 method="POST"
的形式 (?????)
按钮类型 submit
,提交表单并使请求成为 POST 请求。 Django 模板在 request.POST
.
中发送提交的数据
QBY - 现在相同的表单 AnyForm 被“重新加载”(?????) 但参数值为“POST "
在这里,如果 POST 条件末尾的 return 方法是 HttpResponseRedirect 它将把用户重定向到提到的 URL 页面,但如果相同 HTML 用于呈现然后表单将显示为绑定表单。 (视需求而定)
QBY - 现在如果表格有效(我不知道什么是“有效”或“无效”表格)
Form.is_valid()
Form 对象的主要任务是验证数据。使用绑定的 Form 实例,调用 is_valid()
方法进行 运行 验证和 return 指定数据是否有效的布尔值。如果是,则数据正在保存在模型中。
QBY - 然后模板中的所有值都被 (???)
所有值都发送到 request.POST
中的视图。我们可以通过
查看
print(request.POST)
QBY - 被视图写入(?????),form.save
到ModelForm中的相应字段(?? ???)
在 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]
我试图了解 Django views.py 中一个非常常用的代码形式是如何工作的。我看到以下(或变体)使用了很多,但我找不到代码如何工作的逐行解释——如果我要自信地使用它并在需要时修改,我需要它。 如果我理解了 Django 如何处理这些不同的组件,你能告诉我吗?如果不是,请指出我哪里理解错了。
我将从模型开始,然后介绍 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]
url
#
#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" %}
当在显示页面上按下提交按钮时,这会将 {% render_field .. %} 值“传回”(??) 到视图 (?????)
<form method="POST">
...
<div class="col-lg-4">
<button type="submit" class="btn btn-info">Submit</button>
</div>
...
</form>
视图再次执行(????),但这次请求方法设置为“POST”,因为表单方法=“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')
好的,借助参考资料(如下所述)和您建议的工作流程,让我们首先了解 Django MVT 工作流程,然后解决 post 之间提出的各种问题。
带有 Django MVT 的 WebForms 简介:
- 准备几种不同类型的数据以在表格中显示。
- 将数据呈现为 HTML。
- 使用方便的界面编辑、输入数据。
- 验证并清理数据。
- Return 数据到服务器。
- 保存、删除或传递以供进一步处理。
URL:
当用户从您的 Django-powered 站点请求一个页面时,这是系统用来确定执行哪个 Python 代码的算法。这是由我们的 views.py 处理的。从前端来看,如果请求不是 'POST',那么它是一个 GET 请求,因此执行 views.py 中处理函数的 else 部分。这个你已经提到了。
视图:- 发送回 Django 网站的表单数据由视图处理,通常与发布表单的视图相同。这允许我们重用一些相同的逻辑。要处理表单,我们需要在 URL 的视图中实例化它,我们希望它被发布。
如果我们使用request.POST
,如这一行:
form = AnyForm(request.POST)
它将表单转换为绑定表单(Form bound with data)。阅读更多相关信息 here。
您的质疑(QBY) - 当在显示的页面上按下提交按钮时,此“回传”(??) {% render_field .. %}
值到视图 (?????)
所以,是的,如果表单中没有提到 action
属性,那么数据将被传递到负责显示表单的视图。
QBY - 再次执行视图(????),但这次请求方法设置为“POST”,因为模板中 method="POST"
的形式 (?????)
按钮类型 submit
,提交表单并使请求成为 POST 请求。 Django 模板在 request.POST
.
QBY - 现在相同的表单 AnyForm 被“重新加载”(?????) 但参数值为“POST "
在这里,如果 POST 条件末尾的 return 方法是 HttpResponseRedirect 它将把用户重定向到提到的 URL 页面,但如果相同 HTML 用于呈现然后表单将显示为绑定表单。 (视需求而定)
QBY - 现在如果表格有效(我不知道什么是“有效”或“无效”表格)
Form.is_valid()
Form 对象的主要任务是验证数据。使用绑定的 Form 实例,调用 is_valid()
方法进行 运行 验证和 return 指定数据是否有效的布尔值。如果是,则数据正在保存在模型中。
QBY - 然后模板中的所有值都被 (???)
所有值都发送到 request.POST
中的视图。我们可以通过
print(request.POST)
QBY - 被视图写入(?????),form.save
到ModelForm中的相应字段(?? ???)
在 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]