-----UpdateView和CreateView-----
我们有了Project和Schedule列表显示后,现在需要添加新增和修改的操作。可以直接用Django通用视图里的UpdateView和CreateView。根据官网文档的例子,我们先在projtrack/views.py中添加项目新增和修改视图的代码:
# projtrack/views.py
...
# 修改项目视图
class ProjUpdView(generic.UpdateView):
model = Project
fields = ['project_name', 'description', 'project_status']
template_name = 'projtrack/update_form.html'
# 新增项目视图
class ProjNewView(generic.CreateView):
model = Project
fields = ['project_name', 'description', 'project_type', 'project_status']
template_name = 'projtrack/update_form.html'
...
因为编辑和新增页面的前端代码基本一样,我们在这里都指定了template为update_form。也可指定不同的模板。另外也可用template_name_suffix参数去指定模板。比如,如果设定template_name_suffix = '_create_form'
, 则用到的模板将会是projtrack/project_create_form.html。
这里projtrack/update_form.html代码如下:
# projtrack/update_form.html
{% extends "projtrack/index.html" %}
{% block body %}
{% if user.is_authenticated %}
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input class="btn btn-default" type="submit" value="Update" />
</form>
{% endif %}
{% endblock %}
注意:
- 在所有的 POST 表单元素时,需要加上一个
{% csrf_token %}
tag。这是Django提供的CSRF防护机制。 -
{{ form.as_p }}
表示渲染表单为一系列的p标签,每个p标签包含一个字段:
<p>
<label for="id_subject">Subject:</label>
<input id="id_subject" type="text" name="subject" maxlength="100" />
</p>
备注:
其它form在模版中的渲染方式还包括:
-
form.as_ul
:渲染表单为一系列的li标签,每个li 标签包含一个字段 -
form.as_table
:输出表单为一个HTML的table。 -
for field in form
:通过迭代form,获取其中的所有field。field可引用的包括:{{ field.label_tag }}
,{{ field }}
,{{ field.errors }}
。{{ field.label_tag }}
输出为field的label元素,{{ field }}
输出为field的input,{{ field.errors }}
为field的errors元素(errors一般在form验证出错的时候显示)。 -
form.fieldname
:直接将form作为一个dict,引用其每一个field,比如{{ form.title }}
引用form中的title这个field。这种方式一般用于form需要更加精准的样式的时候,逐个元素逐个元素的编排到html中。
完成后可在页面上新增或修改项目信息。不过点击Update后会有一个报错:
![](https://img.haomeiwen.com/i191989/055d8b7a362f2603.png)
意思是新增后修改完成后我们没有定义一个redirect的url去跳转。根据报错的提示,我们可以直接在视图下给success_url参数赋值,或在模型中去定义get_absolute_url()方法,去设置成功后跳转的url。这里我们在模型中添加:
# projtrack/model.py
class Project(models.Model):
...
def get_absolute_url(self):
return reverse('projtrack:project')
这样,在新增或修改项目成功就就跳转到项目列表页面啦!
网友评论