我刚刚开始将我的应用程序从1.1迁移到1.3。
我开始深入了解基于阶级的观点并且被吹走了,但并不是真的很好。
我有一些抱怨但这里的具体问题是:
这是我可以将url模板标记与基于类的一般视图一起使用的唯一方法吗?
Django reverse url with parameters to a class based view
的即。必须为每个网址条目命名?
对我来说这似乎是荒谬的,因为Django的基本哲学之一就是DRY,但在这里我们就是...... RY-ing .....
提前致谢。
修改
所以我有https://gist.github.com/1877374
并得到错误 TemplateSyntaxError 渲染时捕获NoReverseMatch:反向'views.HomeView.as_view',参数'()'和关键字参数'{}'未找到。
我是否错误地使用了这个?
相切:
如果我们必须在urls.py文件中命名每个条目,我想更多地解释为什么我认为我们是RY-ing
我的urls.py通常看起来像 https://gist.github.com/1877462
我完全理解脱钩 这里的要点是我们有能力在需要时。当我需要时,我绝对使用名称功能。否则,为什么我要花费时间和精力来重新添加url到每个条目并命名每个条目,因为它们通常与views.py中类/函数的名称相同?
也许这应该在SO上分成一个单独的问题。
答案 0 :(得分:2)
首先,这不是重复自己。你在哪里命名两次URL?这将重复你自己。
其次,不需要命名网址模式 - 但提供许多优点 - 这就是推荐的原因。它还为您提供了更改视图方法名称的灵活性,而无需更改模板。您可以决定一组网址名称并将其交给设计师处理模板,您可以按照自己喜欢的方式自由命名视图方法(或类)。
第三,您需要将完整路径传递给视图方法 - 因此对于基于类的视图需要as_view
并确保您传递正确的参数数量和类型;并且不要混合位置和关键字参数。
或者,您可以通过命名网址模式来避免上述大部分内容。
答案 1 :(得分:2)
这是一个相当挥手的解释,说明为什么你不能在没有命名的情况下反转基于类的视图。我并不熟悉Django内部,所以我很高兴能够得到纠正。
使用基于功能的视图,
# my_app.views.py
def my_view(request):
return HttpResponse("Hello, world!")
你可以反转my_app.views.my_view
,因为它是可调用视图函数的路径。
使用基于类的视图,
# my_app.views.py
class MyView(TemplateView):
template_name = "hello_world.html"
您无法撤消my_app.views.MyView
,因为它不是可调用的视图对象。可调用视图为MyView.as_view()
。如果您为视图中的变量指定了MyView.as_view()
,如下所示:
# my_app.views.py
class MyView(TemplateView):
template_name = "hello_world.html"
my_view = MyView.as_view()
# urls.py
url('^$', `my_view`),
然后你 能够在没有命名的情况下反转my_view
。这个选项和命名你的网址一样重复,所以我认为你不会喜欢它!。
但是当你将MyView.as_view()
直接放在你的网址模式中时,它就是一个匿名函数。它尚未分配给任何变量,因此没有路径可用于反转它。同样,您将无法撤消以下内容:
url('^$', lambda request: HttpResponse("Hello, World!")),
请注意,url()
基本上只是一个函数,可以更容易地添加命名的url模式。如果您真的不想为自己的网址命名,可以编写自己的功能,自动为您生成名称。
答案 2 :(得分:1)
我没有看到这是如何违反DRY原则的 - 它们都是单独的视图,它们执行不同的操作,并且每个视图都被赋予唯一的标识符,以便在被反转时不会发生碰撞。如果有的话,使用命名URL将减少您必须在模板级别编写的代码,并使您的网址方案更具可读性