【问题标题】:Django, rendering a view from another view (call a specific URL)Django,从另一个视图渲染一个视图(调用一个特定的 URL)
【发布时间】:2016-11-02 14:55:16
【问题描述】:

简单的问题,我是 Django 和 Pyhton 菜鸟...

我正在尝试做一件非常简单的事情,至少我是这么认为的:

我有一个小表格:

<form action="#" method="post">
    {% csrf_token %}
    <label>Company Number:</label>
    <input type="text" name="company" placeholder=""/><br>
    <input type="submit" id="register value=" OK" />
</form>

这是这样映射的:

url(r'^userfilt/insertForm/$', views.insertForm, name='insertForm'),

现在提交此表单后,我想返回主视图:

url(r'^userfilt/$', views.userfilt, name='userfilt')

网址映射文件:

app_name = 'SSO_Management_POC'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^user/$', views.user, name='user'),
    url(r'^userfilt/$', views.userfilt, name='userfilt'),
    url(r'^userfilt/insertForm/$', views.insertForm, name='insertForm'),
    #url(r'^updateForm/$', views.updateForm, name='updateForm'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
    url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(), name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

主视图是这样的(但它不认为这段代码涉及到问题..):

def userfilt(request):
    if request.GET.get('create'):
        return HttpResponseRedirect('insertForm')

    if request.GET.get('update'):
        print request.GET.get('pk')
        return render(request, 'SSO_Management_POC/updateForm.html')

    if request.method == 'POST':
        form = UserForm(request.POST)
        val = request.POST.get('my_textarea')
        return render(request, 'SSO_Management_POC/userfilt.html',
                      {'top_user': TopUser.objects.filter(user_name__regex=val)})
    else:
        print '4'
        return render(request, 'SSO_Management_POC/userfilt.html')

现在,当我提交表单时发生了让我丧命的电话,我只想回到主页,用 POST 调用它,就像往常一样!

return render(request, "SSO_Management_POC/userfilt.html")

我是这样做的,但问题是url没有被重置..结果是这样的,

http://127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/#

结果我在该页面上所做的每个操作都不起作用,因为它不再映射

我的意思是,应该是:

而是

为了更好地解释我的问题..

我去主页(http://127.0.0.1:8000/SSO_Management_POC/userfilt/

“GET /SSO_Management_POC/userfilt/HTTP/1.1”200 2648

然后我点击创建用户来调用表单,它把我带到:(http://127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/)

“GET /SSO_Management_POC/userfilt/insertForm/HTTP/1.1”200 1549

比我提交表单,我想回到主页,我不明白的事情来了: 它把我带到这里

http://127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/#

但我想去这里

http://127.0.0.1:8000/SSO_Management_POC/userfilt

这又是代码:

return render(request, "SSO_Management_POC/userfilt.html")

这是打来的电话:

“POST /SSO_Management_POC/userfilt/insertForm/HTTP/1.1”200 2648

我尝试使用渲染,使用 HttpResponseRedirect 等等......但总是发生我用前一个调用的 url,我希望它被重置,我希望它是 ../ !!!

唯一对我有用的是:

return redirect("../")

但是

  1. 这很脏
  2. 这不允许进行 POST 调用!

更新 感谢丹尼尔,我也这样修复它:

return redirect('/SSO_Management_POC/userfilt')

但它仍然给我同样的问题:

return render(request,'/SSO_Management_POC/userfilt')

让我去http://127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/

非常感谢各位!

【问题讨论】:

  • 我不确定我是否理解您的问题...如果您希望表单从 URL A 重定向到 URL B,您要么必须将 URL B 设为您的目标 (action="...")表单(在这种情况下,视图 B 必须处理表单)或使用 post 到 A 并重定向到 B,但您不能使用 POST 请求加载 URL B。您更喜欢哪个选项?
  • 如果我使用该操作,它总是将我带到127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/… 而不是 /SSO_Management_POC/userfilt.html 它总是将我的文本附加到我的最后一页,表单一!

标签: python django forms redirect post


【解决方案1】:

在成功发布后,您应该始终重定向,而不是渲染。做return redirect(url) 是正确的做法,不清楚你为什么对此不满意。

请注意redirect can accept the name of a URL pattern,这样您就可以使用return redirect('userfilt') 将您带到正确的地方。

【讨论】:

  • 不,不是!如果我这样做:redirect('userfilt') 它会给我这个错误:Reverse for 'userfilt' with arguments '()' and keyword arguments '{}' not found。尝试了 0 种模式:[] 如果我尝试(像往常一样)这样:return redirect('SSO_Management_POC/userfilt.html') (如此清晰,如此简单,应该......)但它把我带到了这里:127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/…
  • 第二种情况是我不明白的,如果我返回 redirect('SSO_Management_POC/userfilt.html') 为什么它会把我带到127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/… ???将该网址附加到前一个网址...
  • 因为你还没有从根开始,通过使用前导斜杠:redirect("/...") 第一个错误大概是因为userfilt 模式包含在命名空间中,你没有给出足够的信息以了解确切的内容。
  • 我添加了所有的url映射py文件,乍一看,我不是专家,他们似乎是对的......
  • 好吧,丹尼尔,我怎么不知道你在哪里,但如果你愿意,我可以给你买一张到这里的票,然后在我空荡荡的脑袋上打几拳……我想是所有关于 LEADING SLASH... :( :(
【解决方案2】:

下面的代码能解决你的问题吗?

在您的模板中:

<form action="{% url 'userfilt' %}" method="post">

【讨论】:

  • 否 :( 如果我这样做,它总是把我带到 127.0.0.1:8000/SSO_Management_POC/userfilt/insertForm/… 而不是 /SSO_Management_POC/userfilt.html
  • 我想通过 url 映射调用表单方法“def insertForm(request)”,它可以工作,这只是我在这个结束时所做的重定向,不会工作,原因它将我请求的 url 附加到前一个...
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2017-09-11
  • 2017-10-07
相关资源
最近更新 更多