django类视图与数据库操作管理器
使用类视图是使用了操作对象的方式来操作视图,比函数视图要强
''' as_view() 函数,表明如果请求方式在['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] 之中,那么就调用该函数! 以函数的方式定义的视图称为函数视图,函数视图便于理解。 但是遇到一个视图对应的路径提供了多种不同HTTP请求方式的支持时, 便需要在一个函数中编写不同的业务逻辑,代码可读性与复用性都不佳。 因此便将请求封装到一个类之中! ''' #类视图的定义方法 urlpatterns = [ # 指定类装饰器! url(r'^register', views.RegisterView.as_view()), ]
使用类视图主要是为了更好的解决一个url之中有可能有多个请求,在views.py之中定义类视图
class RegisterView(View): def get(self, request): return HttpResponse('这是get 请求!') def post(self, request): return HttpResponse('这是post 请求!') def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)
可以为类视图增加一个装饰器添加新的功能
#定义装饰器 def set_fun(func): def call_fun(request, *args, **kwargs): print('这是装饰器!') return func(request, *args, **kwargs) return call_fun # 指定装饰函数!可以指定get post 如果指定了 dispatch 表明可以随着请求的不同进行不同的装饰! @method_decorator(set_fun, name='dispatch') class RegisterView(View): @method_decorator(set_fun) def get(self, request): return HttpResponse('这是get 请求!') def post(self, request): return HttpResponse('这是post 请求!') def dispatch(self, *args, **kwargs): return super().dispatch(*args, **kwargs)
数据库操作管理器是数据操作的接口,如果自定义了管理器那么就不能使用自带的管理器
'''管理器是数据操作的接口!有时候自定义管理器! 实际上,模型管理器是定义了类重写或者新增管理器类的方法! 这样就使用类调用属性的方式来使用自定义的模型管理器! ''' class BookInfoManager(models.Manager): # 重写all方法!(没什么用!) def all(self): # 默认查询未删除的图书信息 # 调用父类的成员语法为:super().方法名 return super().filter(is_delete=False) # 定义管理器创建实例化对象! def create_book(self, title, pub_date): # 创建模型类对象self.model可以获得模型类 book = self.model() book.btitle = title book.bpub_date = pub_date book.bread = 0 book.bcommet = 0 book.is_delete = False # 将数据插入进数据表 book.save() return book # 定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verbose_name='名称') bpub_date = models.DateField(verbose_name='发布日期') bread = models.IntegerField(default=0, verbose_name='阅读量') bcomment = models.IntegerField(default=0, verbose_name='评论量') is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') class Meta: db_table = 'tb_books' # 指明数据库表名 verbose_name = '图书' # 在admin站点中显示的名称 verbose_name_plural = verbose_name # 显示的复数名称 def __str__(self): """定义每个数据对象的显示信息""" return self.btitle # 通过类属性来创建管理器对象! books = BookInfoManager()