【问题标题】:django can't reverse project level view?django 不能反转项目级别的视图?
【发布时间】:2018-01-31 23:01:08
【问题描述】:

我正在尝试在 POST 成功后重定向到视图。如果我尝试在其上添加 kwargs,不知道为什么它不起作用。我试图在没有额外参数的情况下反转它并且它有效。但是当我添加一些条件语句所需的附加变量时,它会导致错误。

我已经检查了文档,这里提出的一些问题和命名空间是解决方案,但据我所知,它是针对应用程序级别的。我在项目下创建了视图。

项目 urls.py

from django.contrib import admin
from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.Index_With_Email_Subscription, name="index"),
    path('humongousdata/', admin.site.urls),
    path('termsofservices/', views.Terms_Of_Services, name="termsofservices"),
    path('me/', include('me.urls')),
    path('thankyou/', views.ThankYou, name="givethanks"),
]

项目视图.py

from django.shortcuts import render, redirect
from django.urls import reverse

def index(request):
    return redirect(reverse('givethanks', kwargs={'thanks_for':'registered'}))

def ThankYou(request, **kwargs):
    print(thanks_for)

错误信息

error screenshot

【问题讨论】:

    标签: python django


    【解决方案1】:

    看起来'givethanks' 的 url 不需要任何 kwargs。 view 函数可以,但 url 模式本身没有 'thanks_for' 的占位符。您可能需要将其修改为

    path('thankyou/<thanks_for>/', views.ThankYou, name="givethanks"),
    

    或类似的东西。

    那么你的观点可以是:

    def ThankYou(request, **kwargs):
        print(kwargs['thanks_for'])
    

    【讨论】:

    • 先生!感谢您的帮助,它的工作原理!我希望我有超过 15 个声望来投票。
    • 我正在考虑不在 url 上显示 kwargs 值,而只显示thankyou/。我担心用户将 url 与 kwargs 一起使用,即使没有实际从成功的 POST 中执行所需的操作以使其成为结果页面。这可能吗?
    • 您可以使用会话变量 (docs.djangoproject.com/en/2.0/topics/http/sessions),仅当他们完成了所需的操作时才设置该变量,然后在您的 ThankYou 视图中检查它以确定您是否要执行任何操作你在想。如果不确切知道您要做什么,就很难说。
    • 好吧,我仍然想打印 kwargs 的值,但不在 url 中显示它。所以这就像如果它只是thankyou/需要采取的行动,它将呈现404,但如果thankyou/请求与kwargs/session一起出现,它会打印它。但我想我可以根据你的建议解决这个问题。很棒的东西。
    • 嗯,URL 中的 kwargs 通常用于资源规范(例如数据库中记录的 ID 或其他东西,或 slugs)——我不建议将它们用于功能逻辑。修改数据库中的某些内容以指示用户已执行特定任务,或设置会话变量。祝你好运!
    猜你喜欢
    • 2016-05-04
    • 2017-04-16
    • 2017-03-12
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2018-05-31
    相关资源
    最近更新 更多