操作标准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 简介:

  1. 准备几种不同类型的数据以在表格中显示。
  2. 将数据呈现为 HTML。
  3. 使用方便的界面编辑、输入数据。
  4. 验证并清理数据。
  5. Return 数据到服务器。
  6. 保存、删除或传递以供进一步处理。

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]