表单和对象创建
编写视图来创建对象可能非常无聊。你必须显示一个表单,你必须验证它,你必须保存该项目或返回带有错误的表单。除非你使用其中一个通用编辑视图 。
应用程序/ 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')
CreateView
和 UpdateView
有两个必需属性 model
和 fields
。默认情况下,两者都使用基于名称后缀为“_form”的模板名称。你只能使用属性 template_name_suffix 更改后缀。DeleteView 在删除对象之前显示确认消息。
UpdateView
和 DeleteView
都需要获取对象。它们使用与 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 下一切顺利运行。