我是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上搜索但什么也没找到。
答案 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
它的上下文。
您可以对UpdateView
和DeleteView
进行相同操作,它们非常相似。实际上,大多数表单处理代码都来自FormMixin
类。
在创建自己的视图时,将Django的通用视图子类化,您会发现有时无法使用视图,但可以使用混合包(例如FormMixin
或ModelFormMixin
)。 / 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在其响应中所述。