如何在Class-Base-View中根据Django中经过的路径创建逻辑模板和模型

How to create logic template and model in Class-Base-View base on the path pass by in Django

我在 Django 中工作和练习了将近一个月,我真的很喜欢它。但是现在我有三个 Class-Base View,它们具有相同的功能,根据我为他们提供的模型显示不同数据库的列表,现在我想要的是只创建一个 Class- Base 查看并根据 url 路径渲染 template_namemodel 路径?因为它们是相同的功能。可以创建吗?

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

  1. 所有三种视图是否只有一个模板?
  2. 每个 class-based 视图中是否有独特的过滤逻辑,或者您只获取所有对象?

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

注意:它没有经过测试,但理论上应该可以工作


views.py

class VehicleListView(ListView):
    pass

urls.py

这里的主要思想是关于每个 CBV 的 as_view 方法。它允许您设置现有 class 属性的值。有关详细信息,请参阅此处

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())),
    path('bike/', VehicleListView.as_view(queryset=Bike.objects.all())),
    path('boat/', 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)),
    path('bike/', VehicleListView.as_view(get_queryset=get_bikes)),
    path('boat/', 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