【问题标题】:Django: view arguments after POST?Django:POST后查看参数?
【发布时间】:2017-07-31 20:58:45
【问题描述】:

我通过 HttpResponseRedirect 从其他地方调用我的“editFamily”视图:

return HttpResponseRedirect(reverse('editFamily', kwargs={'pk': family_id}))

对应的url模式如下:

url(r'^editFamily/(?P<pk>[0-9]+)/$', views.editFamily, name='editFamily')

最后是我的观点:

def editFamily(request, pk_):

    obj = models.Family.objects.all().filter(pk=pk_)

    if request.method == 'POST':
        form = forms.FamilyForm(request.POST, instance=obj)
        if form.is_valid():
            form.save()
    else:
        form = forms.FamilyForm(instance=obj)

    return render(request, 'editFamily.html', {'form': form})

它需要 pk_,最终进入 else 分支并为我的 edit-html 提供服务。但是在查看者提交关于参数 pk_ 的数据后会发生什么?当我来自 POST 时,pk_ 是否丢失?我是否必须以某种方式确保在我的模板中传递该参数?

【问题讨论】:

  • 你为什么使用 pk_ ?请改用 pk。
  • 因为 "filter(pk=pk)" ...对我来说看起来很奇怪,我想避免错误。
  • 但您的变量应该与您在 urls.py 文件中使用的内容相匹配。您可以使用url(r'^editFamily/(?P&lt;id&gt;[0-9]+)/$', views.editFamily, name='editFamily'),然后使用def editFamily(request,id):
  • @user3182532: filter(pk=pk) 虽然是完全惯用的,但不会出错。
  • 好的,那我就回去 pk=pk :)

标签: python django


【解决方案1】:

因为您想使用 pk 以外的其他变量。为了您的方便,让我们使用变量 id
将 urls.py 更改为

 url(r'^editFamily/(?P<id>[0-9]+)/$', views.editFamily, name='editFamily')  

在views.py中你可以从url路径访问变量

def editFamily(request, id):
    obj = models.Family.objects.all().filter(pk=id)
    if request.method == 'POST':
        form = forms.FamilyForm(request.POST, instance=obj)
        if form.is_valid():
            form.save()
    else:
        form = forms.FamilyForm(instance=obj)

    return render(request, 'editFamily.html', {'form': form})  

在 urls.py 和 views.py 中使用相同的名称很重要,以便视图函数可以按名称从其 url 路径中选择变量。

【讨论】:

  • 感谢您的提示,您是对的。如果 urls.py 和 views.py 的参数名称不匹配,我会收到错误
【解决方案2】:

不,它不会丢失。表单被提交到同一个页面,所以 URL 保持不变并且参数仍然存在。

【讨论】:

  • 好的,谢谢!我没有在文档中找到该主题
猜你喜欢
  • 2016-02-21
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 2014-11-30
相关资源
最近更新 更多