美文网首页百人计划《Django By Example》
Django-05-视图UpdateView和CreateVie

Django-05-视图UpdateView和CreateVie

作者: JOooo_ | 来源:发表于2018-06-26 16:22 被阅读27次

-----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 %}

注意:

  1. 在所有的 POST 表单元素时,需要加上一个 {% csrf_token %} tag。这是Django提供的CSRF防护机制。
  2. {{ 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后会有一个报错:

意思是新增后修改完成后我们没有定义一个redirect的url去跳转。根据报错的提示,我们可以直接在视图下给success_url参数赋值,或在模型中去定义get_absolute_url()方法,去设置成功后跳转的url。这里我们在模型中添加:

# projtrack/model.py

class Project(models.Model):
    ...
    def get_absolute_url(self):
        return reverse('projtrack:project')

这样,在新增或修改项目成功就就跳转到项目列表页面啦!

相关文章

网友评论

    本文标题:Django-05-视图UpdateView和CreateVie

    本文链接:https://www.haomeiwen.com/subject/errqyftx.html