表單和物件建立
編寫檢視來建立物件可能非常無聊。你必須顯示一個表單,你必須驗證它,你必須儲存該專案或返回帶有錯誤的表單。除非你使用其中一個通用編輯檢視 。
應用程式/ 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 下一切順利執行。