django 1.3 url模板标签和基于类的视图

时间:2012-02-21 03:33:44

标签: django django-views django-templates django-class-based-views

我刚刚开始将我的应用程序从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上分成一个单独的问题。

3 个答案:

答案 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将减少您必须在模板级别编写的代码,并使您的网址方案更具可读性