Django 面向网站最常见的 CURD 提供了一系列基于类视图的封装,比如需要做一个创建内容的表单,直接在视图创建继承 CreateView 的类,随后添加路由,配置模板即可。

CreateView

from django.shortcuts import reverse
from django.views.generic.edit import UpdateView, CreateView
from product.models import ProductImage

class ProductAdd(CreateView):
    model = ProductImage
    fields = '__all__'
    template_name = 'myapp/product_add.html'

    def get_success_url(self):
        return reverse('myapp.product')
    
    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = '添加产品'
        return context

UpdateView

如果需要成功提示消息,可以引入 SuccessMessageMixin,并设置 success_message

如果仅允许登录用户访问,可以引入 LoginRequiredMixin

from django.shortcuts import reverse
from django.views.generic.edit import UpdateView, CreateView
from django.contrib.messages.views import SuccessMessageMixin
from django.contrib.auth.mixins import LoginRequiredMixin
from product.models import ProductImage

class ProductEdit(LoginRequiredMixin, SuccessMessageMixin, UpdateView):
    model = ProductImage
    fields = ['name', 'model_number', 'intro', 'pic_1', 'pic_2']
    template_name = 'myapp/product_edit.html'
    success_message = '产品信息更新成功!'

    def get_success_url(self):
        return reverse('myapp.product.edit', args=(self.object.id,))

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = '编辑产品'
        return context

注意:reverse() 第二个参数 args=(self.object.id,),最后有个 ,,没有这个半角逗号会报错,可能和 Python 对元祖的格式判断有关。

如何获得页面对象

比如我们新增了一个产品,想获取到这个产品对象,可以通过 self.object,比如获得页面对象的 ID 可以 self.object.id

路由

from django.urls import path

from . import views

urlpatterns = [
    path('', views.ExpoCenter.as_view(), name='expo.home'),
    path('product/edit/<int:pk>/', views.ProductEdit.as_view(), name='myapp.product.edit'),
    path('product/add/', views.ProductAdd.as_view(), name='myapp.product.add'),
]

Reference