表單和物件建立

編寫檢視來建立物件可能非常無聊。你必須顯示一個表單,你必須驗證它,你必須儲存該專案或返回帶有錯誤的表單。除非你使用其中一個通用編輯檢視

應用程式/ 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 下一切順利執行。