Django-网址中的视图或条件根据参数是否具有值或为NONE选择两个网址模式之一

时间:2018-08-15 15:18:30

标签: python django django-views django-urls django-2.0

有两种模型:groupsposts。帖子可以是以下两种之一:分配给该组,而不分配给该组。在posts模型中,将组分配给帖子的外键字段是可选的。属于一个组的帖子的地址应该不同于不属于该组的帖子的地址。这是一般规则。前者是帖子不属于任何组的地址,后者则是属于该组的地址。

.../posts/[year]/[month]/[day]/[slug of the post]/

.../groups/[name of the group]/posts/[year]/[month]/[day]/[slug of the post]/

出现问题。创建帖子后,两个网址都可以使用。

这并不奇怪,因为我include应用中posts的{​​{1}}应用中的URL urls.py

我想做的是使URL地址对于groups参数是可选的(无论是否传递)。它可以像这样工作:

  • 如果groups参数不是None,请从group中选择网址
  • 如果groups参数不是None,则从groups.urls中排除url

基本上,我只想选择一个网址,而不是两个。

在Django中是否可以通过简单的方式做到这一点?还是唯一的解决方案创建了两个模型/两个应用程序而不是一个?

我的代码节选:

groups / urls.py

posts.urls

posts / urls.py

app_name = 'groups'

urlpatterns = [
    ...
    path('<slug:slug>/posts/', include('posts.urls', namespace='grouppost')),
    ...
]

我正在使用Django 2.0.7。

更新16.08

我也以app_name = 'posts' urlpatterns = [ path('', views.PostList.as_view(), name='list'), path('create', views.CreatePost.as_view(), name='create'), path('<int:year>/<int:month>/<int:day>/<slug:slug>/', views.PostDetail.as_view(), name='detail'), path('<int:year>/<int:month>/<int:day>/<slug:slug>/update/', views.UpdatePost.as_view(), name='update'), path('<int:year>/<int:month>/<int:day>/<slug:slug>/delete/', views.DeletePost.as_view(), name='delete'), ] 的根include path。抱歉,遗漏了此重要信息。

urls.py

urls.py

1 个答案:

答案 0 :(得分:1)

您应该尝试避免网址中的逻辑。这就是更低级别的视图或业务逻辑的目的。相反,您可以创建一个充当重定向页面的视图,该视图采用所需的参数,并根据其内容重定向到正确的URL。

如果这样做,则需要跟踪任何请求参数。

# url (located wherever you want):
(r'post-redirection/<string:posts_or_group>/<int:year>/<int:month>/<int:day>/<slug:slug>/', post_redirection, name="post_redirection")

# view:
def post_redirection(request, post_or_group, year, month, day, slug):
    if post_or_group == "post":
         post_url_name = "..." # This is the url that you want to go to if it is a request to .../posts/[year]/[month]/[day]/[slug of the post]/
         return HttpResponseRedirect(reverse(post_url_name, kwargs={"year": year, "month": month, "day": day, "slug": slug}))

    elif post_or_group == "groups":
         group_url_name = "..." # This is the url that you want to go to if it is a request to .../groups/[name of the group]/posts/[year]/[month]/[day]/[slug of the post]/
         return HttpResponseRedirect(reverse(group_url_name, kwargs={"year": year, "month": month, "day": day, "slug": slug}))

    else:
        # error. However you want to handle it. You could return an error response or do something else. Maybe return a message that says they didn't choose the right option.

您可能会遇到的唯一问题是保留请求数据(即request.POST或request.GET)。您仍然可以使用这种方法,您只需要找到一种在新的重定向请求中传递数据的方法,因为该数据仅持续一个请求。