在 listview 类方法中包含业务逻辑的位置
Posted
技术标签:
【中文标题】在 listview 类方法中包含业务逻辑的位置【英文标题】:where to include business logic in listview Class methods 【发布时间】:2013-01-30 16:52:04 【问题描述】:我正在尝试了解 Django 的基于类的视图(对它来说非常新),尤其是 ListView。我正在努力理解“业务逻辑应该去哪里”。例如,我有以下课程:
#views.py
class DisplayListView(ListView):
model = Cars
template_name = "searchres_list.html"
paginate_by = '5'
context_object_name = "titles"
def get_context_data(self, **kwargs):
context = super(SearchDisplayListView, self).get_context_data(**kwargs)
# custom logic whoch spits out "now". in this example [1 -->10]
context['now'] = [1,2,3,4,5,6,7,8,9,10]
return context
它工作正常,我可以在我的模板上查看 [1 --> 10]。但是,当我查看ListView 下可用的方法时,我发现我可能会将我的逻辑包含在 get_queryset 方法中。所以,像:
def get_queryset(self):
# Fetch the queryset from the parent get_queryset
queryset = super(SearchDisplayListView, self).get_queryset()
# custom logic whoch spits out "now". in this example [1 -->10]
queryset = [1,2,3,4,5,6,7,8,9,10]
return queryset
所以,我相当(愚蠢)的问题是(或者我完全错了!),理想的业务逻辑应该去哪里:
-
def get_context_data
def get_queryset
感谢您的宝贵时间。
【问题讨论】:
【参考方案1】:对于这样一个主观问题的最佳答案可能是:视情况而定。
我个人处理这种情况的算法如下:
如果您需要在 context 中添加一些内容以将其传递给模板,那么您实际上别无选择,因为在 get_queryset 方法中您可以只修改您的 ListView 的查询集。所以我在这种情况下使用 get_context_data。 但是如果您要执行一些动态查询集修改,假设您的视图可以在类似的模型类上运行,并且实际的类由传递给视图的参数确定,那么您可能需要覆盖 get_queryset 方法。希望我能给你一些关于这个话题的见解:)
【讨论】:
非常感谢 - 但是我不明白你的第一点 - 你的意思是“因为在 get_queryset 方法中你只能修改你的 ListView 的查询集”你能解释一下吗?正如我所看到的,我可以将查询集或上下文数据传递给模板——除了模板标签,一切似乎都正常——不管我把数据放在哪里——查询集或上下文。不是这样吗? 因此,当您从get_queryset
方法更改 queryset
属性时,您基本上会更改模板中的 object_list
。例如,您不能将表单对象从get_queryset
添加到上下文中。您需要使用get_context_data
来实现这一点。
谢谢 - 我现在明白了!接受你的回答:)以上是关于在 listview 类方法中包含业务逻辑的位置的主要内容,如果未能解决你的问题,请参考以下文章
Flutter中包含GridViews和ListViews的ListView
listview相关问题—item中包含EditText的处理 (高上)
listview相关问题—item中包含EditText的处理 (高上)