Django Generic editing views 笔记
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'),
]