如何在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_name
和 model
路径?因为它们是相同的功能。可以创建吗?
如果没有更多细节,很难给出正确答案。实际解决方案可能会有所不同,具体取决于:
- 所有三种视图是否只有一个模板?
- 每个 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.html
或 myapp/boat_list.html
。有关详细信息,请参阅此函数 https://github.com/django/django/blob/f3901b5899d746dc5b754115d94ce9a045b4db0a/django/views/generic/list.py#L165-L191
我在 Django 中工作和练习了将近一个月,我真的很喜欢它。但是现在我有三个 Class-Base View,它们具有相同的功能,根据我为他们提供的模型显示不同数据库的列表,现在我想要的是只创建一个 Class- Base 查看并根据 url 路径渲染 template_name
和 model
路径?因为它们是相同的功能。可以创建吗?
如果没有更多细节,很难给出正确答案。实际解决方案可能会有所不同,具体取决于:
- 所有三种视图是否只有一个模板?
- 每个 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.html
或 myapp/boat_list.html
。有关详细信息,请参阅此函数 https://github.com/django/django/blob/f3901b5899d746dc5b754115d94ce9a045b4db0a/django/views/generic/list.py#L165-L191