如何基于Django中传递的路径在Class-Base-View中创建逻辑模板和模型

问题描述

我将近一个月的时间在Django中工作和练习自我,我真的很喜欢它。但是现在我有三个基于类的视图,它们具有相同的功能,可以根据我为他们提供的模型显示不同数据库的列表,现在,我想要的是仅创建一个基于类的视图并呈现{{1 }}和template_name是否基于URL路径传递?由于它们具有相同的功能。有可能创建吗?

解决方法

如果没有更多细节,很难给出正确答案。实际的解决方案可能会有所不同,具体取决于:

  1. 三个视图中只有一个模板吗?
  2. 在每个基于类的视图中您是否具有唯一的过滤逻辑,或者仅获取所有对象?

,依此类推。但我可以分享一种通用解决方案,如果需要,可以由您修改。

注意:它尚未经过测试,但应在理论上起作用


views.py

class VehicleListView(ListView):
    pass

urls.py

这里的主要思想是关于每个CBV的as_view方法。它使您可以设置现有的类属性的值。有关更多信息,请参见此处

https://github.com/django/django/blob/f3901b5899d746dc5b754115d94ce9a045b4db0a/django/views/generic/base.py#L63 https://github.com/django/django/blob/f3901b5899d746dc5b754115d94ce9a045b4db0a/django/views/generic/base.py#L45-L46

获取每个模型的所有元素

urlpatterns = [
    path('cars/',VehicleListView.as_view(model=Car)),path('bike/',VehicleListView.as_view(model=Bike)),path('boat/',VehicleListView.as_view(model=Boat)),]

简单的自定义查询集

urlpatterns = [
    path('cars/',VehicleListView.as_view(queryset=Car.objects.all())),VehicleListView.as_view(queryset=Bike.objects.all())),VehicleListView.as_view(queryset=Boat.objects.all())),]

复杂的自定义查询集

def get_cars(cbv_instance):
    pass

def get_bikes(cbv_instance):
    pass

def get_boats(cbv_instance):
    pass

urlpatterns = [
    path('cars/',VehicleListView.as_view(get_queryset=get_cars)),VehicleListView.as_view(get_queryset=get_bikes)),VehicleListView.as_view(get_queryset=get_boats)),]

甚至更好-将“查询集内容”封装在模型管理器中,并像简单的queryset参数一样传递

path('boat/',VehicleListView.as_view(queryset=Boat.objects.get_boats_for_today()))

(但在这种情况下,您将无权访问CBV实例,即请求之类的东西)。

模板

模板名称是根据给定的模型或给定的查询集生成的。例如:myapp/car_list.htmlmyapp/boat_list.html。有关更多信息,请参考此功能https://github.com/django/django/blob/f3901b5899d746dc5b754115d94ce9a045b4db0a/django/views/generic/list.py#L165-L191