我最初会问如何做,但似乎你可以传递方法名称,就像你可以传递属性名称一样。这是不好的做法吗?有什么理由不去做吗?
from .models import Theme, Post
from django.views.generic import ListView, DetailView
class ThemesOverview(ListView):
"""
Overview of all themes
"""
model = Theme
template_name = 'content/theme_list.html'
def get_queryset(self):
queryset = Theme.objects.all()
return queryset
class ThemePostsOverview(ListView):
"""
Overview of all posts within a theme
"""
model = Post
template_name = 'content/theme_posts_list.html'
def get_context_data(self, **kwargs):
# Call the base implementation first to get a context
context = super(ThemePostsOverview, self).get_context_data(**kwargs)
slug = self.kwargs['theme']
theme = Theme.objects.get(title=slug)
context['theme'] = theme
return context
def get_queryset(self):
queryset = Post.objects.all()
return queryset
答案 0 :(得分:1)
这不是一个坏习惯,实际上是常见的事情。
它主要用于代码分离或用于制作通用实现,例如,带有自定义回调的http请求。
答案 1 :(得分:1)
这是不好的做法吗?
没有
有什么理由不这样做?
这取决于你需要什么。通过"动词"从一组预设动作中选择的函数是非常有限的,传递一个函数本身("回调")允许调用者传递任意代码。
因此,如果您希望限制可能的操作,或者如果您的域要求限制了一组有用的操作,那么这种模式是适合的,无论如何它并不重要,但在其他情况下它感觉有点不灵活。
比较
DECLARE @data TABLE (ID int IDENTITY(1,1), X int, NoRequired int);
INSERT INTO @data(X, NoRequired)
VALUES (1000,1), (1000,1), (800,2), (600,3), (1000,4), (1000,4), (800,5);
SELECT *
FROM @data;
到
function doSomeAction(actionName){
var actionsObj = {
writeSomething: function(x){ console.log(x); },
…
};
actionsObj[actionName]('lol');
}
doSomeAction('writeSomething');
doSomeAction('someOtherOption'); // restricted by the callee
…
主要区别在于代码中可能采取的行动。 function doSomeAction(action){
action('lol');
}
doSomeAction(function(x){ console.log(x); });
doSomeAction(anyOtherFunction); // chosen by the caller
…
是否需要了解所有这些内容,每次都是一样的吗?