【问题标题】:Django does it make sense to define get_create_url(), get_update_url() and get_delete_url() for objectDjango 为对象定义 get_create_url()、get_update_url() 和 get_delete_url() 是否有意义
【发布时间】:2014-04-10 00:25:45
【问题描述】:

每个具有唯一 url 的对象都应该有 get_absolute_url() ,它通常返回对象的详细视图。通常这些对象也有创建、更新和删除视图,并且 url 需要一些参数才能工作。您可以在模板中为这些 url 提供参数,但如果您更改了 url 结构等,您还必须更改所有模板而不是那个函数。那么:定义创建、编辑和删除 url 的方法是一种好习惯,还是这种方法存在一些问题?

考虑一个例子,我有一个博客,博客所有者可以向其中添加帖子、编辑和删除它们。 Post 有一个指向 blog 的外键。帖子的详细模板可以包含以下链接:

<a href="{% url 'post-edit' blog=post.blog.pk pk=post.pk %}">edit post</a>
<a href="{% url 'post-delete' blog=post.blog.pk pk=post.pk %}">delete post</a>
<a href="{{ post.blog.get_absolute_url }}">back to blog</a>

和网址:

url(r'^blog-(?P<blog>\d+)/post-(?P<pk>[-\w]+)/$', views.PostView.as_view(),  name='post-view'),
url(r'^post-new/blog-(?P<blog>\d+)/$', views.CreatePostView.as_view(), name='post-new'),
url(r'^post-edit/blog-(?P<blog>\d+)/post-(?P<pk>\d+)/$', views.UpdatePostView.as_view(), name='post-edit',),
url(r'^post-delete/blog-(?P<blog>\d+)/post-(?P<pk>\d+)/$', views.DeletePostView.as_view(), name='post-delete',),

不是最好的例子,但我希望你明白我的意思。

【问题讨论】:

    标签: django django-templates django-urls


    【解决方案1】:

    至少,如何设计内部命名完全取决于您。

    对我来说,作为一个长期的 djangoist,我使用的是相同的并且从来没有问题。我的团队也喜欢这种“开发范式”。

    我们将应用程序 urls.py 包含在根目录 urls.py 中,并将 URL 命名为与您几乎相同的名称...除了如果需要,我们还将应用程序名称添加到 url-name 中。在您的示例中,这将是 blog-post-newblog-post-delete

    示例

    urlpatterns = patterns('service.views',
        # /services/1/edit/
        url(r'^(?P<service_pk>\d+)/edit/$',
            view = 'edit',
            name = 'service-edit',
        ),
        # /services/add/
        url(r'^add/$',
            view = 'add',
            name = 'service-add',
        ),
        # /services/1/delete/
        url(r'^(?P<service_pk>\d+)/delete/$',
            view = 'delete',
            name = 'service-delete',
        ),
        # /services/1/permissions/
        url(r'^(?P<service_pk>\d+)/permissions/$',
            view = 'permissions',
            name = 'service-permissions',
        ),
    )
    

    所以,做任何适合你的事情 - 没有“错误”,请记住,可能会有另一个应用程序通过“发布”进入您的项目;)

    【讨论】:

    • 感谢您的回答。我在实现我的 get_create_url 时遇到问题,因为我需要某种方式来传递每篇文章属于哪个博客模型的信息。它在创建之前没有博客,所以我无法实现 get_create_url() 以便它返回 reverse('post-new', kwargs={'blog': self.blog.pk})。在我的模板中它现在可以工作了,因为将博客添加到上下文数据中,所以我可以编写 {% url 'post-new' blog=blog.pk %}。如果您在模型中实现所有内容,您将如何做到这一点?这可能是一个愚蠢的问题,但我完全是 django 的初学者 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2011-06-04
    • 2011-04-02
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多