问题描述
我将近一个月的时间在Django中工作和练习自我,我真的很喜欢它。但是现在我有三个基于类的视图,它们具有相同的功能,可以根据我为他们提供的模型显示不同数据库的列表,现在,我想要的是仅创建一个基于类的视图并呈现{{1 }}和template_name
是否基于URL路径传递?由于它们具有相同的功能。有可能创建吗?
解决方法
如果没有更多细节,很难给出正确答案。实际的解决方案可能会有所不同,具体取决于:
- 三个视图中只有一个模板吗?
- 在每个基于类的视图中您是否具有唯一的过滤逻辑,或者仅获取所有对象?
,依此类推。但我可以分享一种通用解决方案,如果需要,可以由您修改。
注意:它尚未经过测试,但应在理论上起作用
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.html
或myapp/boat_list.html
。有关更多信息,请参考此功能https://github.com/django/django/blob/f3901b5899d746dc5b754115d94ce9a045b4db0a/django/views/generic/list.py#L165-L191