1

我刚刚开始将我必须从 1.1 迁移到 1.3 的应用程序。

我开始深入了解基于类的观点并且被震撼了,但并不是真的很好。
我有一些抱怨,但这里的具体问题是:

这是我可以将 url 模板标签与基于类的通用视图一起使用的唯一方法吗?
带有参数的 Django 反向 url 到基于类的视图
,即必须命名每个 url 条目?

对我来说这似乎很荒谬,因为 Django 的基本哲学之一是 DRY,但我们在这里...... RY-ing......

提前致谢。

编辑:
所以我有https://gist.github.com/1877374

并得到错误 TemplateSyntaxError Caught NoReverseMatch while rendering: Reverse for 'views.HomeView.as_view' with arguments '()' and keyword arguments '{}' not found.

我用错了吗?


Tangent:如果我们必须命名urls.py 文件中的每一个条目
, 我想再解释一下为什么我认为我们是 RY-ing

我的 urls.py 通常看起来像 https://gist.github.com/1877462

我完全了解脱钩。
这里的重点是我们有能力在需要时这样做。当我需要时,我绝对会使用名称功能。否则,我为什么要花时间和精力为每个条目添加 url 并命名每个条目,而它们通常与views.py 中的类/函数的名称相同?

也许这应该分成一个关于 SO 的单独问题。

4

3 回答 3

2

首先,这不是重复你自己。你在哪里命名 URL 两次?那将是重复自己。

其次,url 模式的命名不是必需的——但它提供了许多优点——这就是推荐的原因。它还为您提供了更改视图方法名称的灵活性,而无需更改模板。您可以决定一组 url 名称并将它们交给您的设计人员来处理模板,并且您可以自由地以您喜欢的方式命名您的视图方法(或类)。

第三,您需要将完整路径传递给视图方法——因此它需要as_view用于基于类的视图,并确保您传递正确数量和类型的参数;并且不要混合位置参数和关键字参数。

或者,您可以通过命名您的 URL 模式来避免上述大多数情况。

于 2012-02-21T06:49:54.840 回答
2

这是一个相当挥手的解释,为什么你不能在不命名它们的情况下反转基于类的视图。我对 Django 内部结构不是很熟悉,所以我很高兴得到纠正。

使用基于功能的视图,

# my_app.views.py
def my_view(request):
    return HttpResponse("Hello, world!")

您可以 reverse my_app.views.my_view,因为它是可调用视图函数的路径。

使用基于类的视图,

# my_app.views.py
class MyView(TemplateView):
    template_name = "hello_world.html"

你不能 reverse 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 模式时,它是一个匿名函数。它尚未分配给任何变量,因此没有可用于反转它的路径。同样,您将无法撤消以下操作:

url('^$', lambda request: HttpResponse("Hello, World!")), 

请注意,这url()基本上只是一个可以更轻松地添加命名 url 模式的函数。如果您真的不想命名您的网址,您可以编写自己的函数来自动为您生成名称。

于 2012-03-05T23:25:25.970 回答
1

我看不出这是如何违反 DRY 原则的——它们都是不同的视图,做不同的事情,并且每个视图都被赋予一个唯一的标识符,以免在反转时发生冲突。如果有的话,使用命名 URL 将减少您必须在模板级别编写的代码并使您的 url 方案更具可读性

于 2012-02-21T06:51:08.020 回答