表单和对象创建

编写视图来创建对象可能非常无聊。你必须显示一个表单,你必须验证它,你必须保存该项目或返回带有错误的表单。除非你使用其中一个通用编辑视图

应用程序/ views.py

from django.core.urlresolvers import reverse_lazy
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import Pokemon

class PokemonCreate(CreateView):
    model = Pokemon
    fields = ['name', 'species']

class PokemonUpdate(UpdateView):
    model = Pokemon
    fields = ['name', 'species']

class PokemonDelete(DeleteView):
    model = Pokemon
    success_url = reverse_lazy('pokedex')

CreateViewUpdateView 有两个必需属性 modelfields。默认情况下,两者都使用基于名称后缀为“_form”的模板名称。你只能使用属性 template_name_suffix 更改后缀。DeleteView 在删除对象之前显示确认消息。

UpdateViewDeleteView 都需要获取对象。它们使用与 DetailView 相同的方法,从 url 中提取变量并匹配对象字段。

app / templates / app / pokemon_form.html(摘录)

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save" />
</form>

form 包含所有必填字段的表单。在这里,由于 as_p,它将显示每个字段的段落。

app / templates / app / pokemon_confirm_delete.html(摘录)

<form action="" method="post">
    {% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm" />
</form>

csrf_token 标签是必需的,因为 django 防止请求伪造。由于显示表单的 url 与处理删除/保存的 url 相同,因此属性操作为空。

如果使用与列表和详细信息示例相同的问题,模型仍然存在两个问题。首先,创建和更新将抱怨缺少重定向 URL。这可以通过在口袋妖怪模型中添加 get_absolute_url 来解决。第二个问题是删除确认没有显示有意义的信息。要解决这个问题,最简单的解决方案是添加字符串表示。

应用程序/ models.py

from django.db import models
from django.urls import reverse
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Pokemon(models.Model):
    name = models.CharField(max_length=24)
    species = models.CharField(max_length=48)

    def get_absolute_url(self):
        return reverse('app:pokemon', kwargs={'pk':self.pk})

    def __str__(self):
        return self.name

类装饰器将确保在 python 2 下一切顺利运行。