django默认上下文变量

时间:2019-03-06 16:28:07

标签: python django django-templates

我是Django Web开发人员的新手,在this tutorial之后设法建立了一个玩具项目。

但是我发现Django官方文档以及本教程非常混乱,我很难遵循,尤其是 template上下文变量

例如,在xxapp/views.py中,我们定义了以下几种视图,

from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy

from catalog.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = '__all__'
    initial = {'date_of_death': '05/01/2018'}

class AuthorUpdate(UpdateView):
    model = Author
    fields = ['first_name', 'last_name', 'date_of_birth', 'date_of_death']

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('authors')

然后在模板中,我们有了

{% extends "base_generic.html" %}

{% block content %}
  <form action="" method="post">
    {% csrf_token %}
    <table>
    {{ form.as_table }} <!-- WHERE IS THIS "FORM" FROM? -->
    </table>
    <input type="submit" value="Submit">
  </form>
{% endblock %}

我理解此模板文件,除了一件事之外,form.as_table的来源和来源是什么?

我知道,如果我们使用一些内置的类视图或模型,则可能会免费获得一些上下文数据,但是我在哪里查找它们,我在Django上搜索但什么也没找到。

2 个答案:

答案 0 :(得分:1)

“表单”是您需要从视图传递到模板的变量。

您应该创建一个forms.py文件来设置所有表单。

在此文件中,您将创建一个简单的表单,如下所示:

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)

然后在您看来,您应该导入表单,然后将“ form”变量设置为:

form = NameForm()

或者如果您已发布数据:

form = NameForm(request.POST)

因此,一旦将此变量传递给模板,就可以像使用“ form.as_table”一样调用整个表单。

或者您可以调用单个表单字段,例如:

{{ form.your_name.label }}
{{ form.your_name }}
{{ form.your_name.errors }}

有关详细信息,请参见Django网站上的此帮助文档:https://docs.djangoproject.com/en/2.1/topics/forms/#the-form-class

答案 1 :(得分:1)

您使用的是基于类的通用视图,其中包含许多功能。查找它们的最佳来源是this one

例如,以CreateView为例(编辑-> CreateView),您会看到get()方法,这是在您仅使用GET获取页面时调用的第一个方法,只需使用从render_to_response()获取的上下文数据调用get_context_data()

get_context_data()内,我们向上下文添加一个form上下文变量,该变量被分配给get_form()。等等...

post()方法相同,在此方法中,首先获取form,检查其有效性,如果无效,form_invalid()方法将使用form它的上下文。

您可以对UpdateViewDeleteView进行相同操作,它们非常相似。实际上,大多数表单处理代码都来自FormMixin类。

在创建自己的视图时,将Django的通用视图子类化,您会发现有时无法使用视图,但可以使用混合包(例如FormMixinModelFormMixin)。 / p>

因此,模板中的form是您在常规视图中指定的ModelForm模型的Author。该视图使用modelform_factory通过fields从模型中自动生成该表单,并使用'form'指定了字段。由于它已作为{{ form }}键添加到用于渲染模板的上下文中,因此您可以使用{{ form.as_table }}访问它。 <table>将以form_class的形式呈现此表单的HTML,如here所述。

如果您不喜欢表单的外观并想要自定义某些字段(并且不能仅通过更改模板来做到这一点),则需要创建自己的表单,并告诉您有关它的看法通过设置fields属性并删除DWORD FindProcessId(const std::wstring& processName) { PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof(processInfo); HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (processesSnapshot == INVALID_HANDLE_VALUE) { return 0; } Process32First(processesSnapshot, &processInfo); if (!processName.compare(processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } while (Process32Next(processesSnapshot, &processInfo)) { if (!processName.compare(processInfo.szExeFile)) { CloseHandle(processesSnapshot); return processInfo.th32ProcessID; } } CloseHandle(processesSnapshot); return 0; } 属性(这些字段将在您的表单中指定),如@drew在其响应中所述。