【问题标题】:Django redirect call appends package name to urlDjango 重定向调用将包名称附加到 url
【发布时间】:2015-03-18 11:11:59
【问题描述】:

我正在编写一个用于在 django 中编辑标题的视图(在 'project_edit.html',并重定向到 'project_detail.html' 页面,但是(松散地)按照教程 here 我正在使用重定向方法:

def project_edit(request, project_id):
    project = get_object_or_404(Project, pk=project_id)
    if request.method == "POST":
        form = ProjectForm(request.POST)
        if form.is_valid():
            project_update = form.save(commit=False)
            project.title = project_update.title
            project.save()
            return redirect(to='gantt_charts.views.project_detail', kwargs={'pk', project.pk}, permanent=True)
        else:
            messages.error(request, "Form invalid!")
            return render(request, 'project_edit.html', {'project':project, 'form':form})
    else:
        form = ProjectForm()
    return render(request, 'project_edit.html', {'project':project, 'form':form})

在教程中,他们也使用了重定向:

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('blog.views.post_detail', pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

但是当我点击我的链接http://localhost:8000/project/2/edit 并提交我的表单时,我会被发送到:http://localhost:8000/project/2/gantt_charts.views.project_detail

我无法理解为什么。

查看shortcuts.py 中的redirect 定义,然后查看resolve_url 定义,我唯一的猜测是它跌到了底部,然后就原样返回了。为什么不执行查找?

编:

这是我为该应用程序提供的网址格式:

urlpatterns = patterns('', 
    url(r'^(?:project)?/?$', views.project_list), 
    url(r'^project/(?P<project_id>\d+)/edit$', views.project_edit), 
    url(r'^project/(?P<project_id>\d+)/[A-z\\-]{0,50}$', views.project_detail), 
    )

【问题讨论】:

  • 好吧,如果它不匹配 to 一个 url 模式,它假定它是一个实际的 URL。那么你的 urlpatterns 是什么样的呢?
  • @DanielRoseman 我已经把它们加进去了。是不是我的可选 50 字 slug 搞砸了?
  • 否:但该 URL 采用 project_id kwarg,而不是 pk
  • @DanielRoseman 好点。哦,我已经解决了这个问题,并按照Catavaran 的回答中的建议进行操作。有用。非常感谢。

标签: python django django-forms django-views


【解决方案1】:

为您的项目详细信息网址添加名称:

url(r'^project/(?P<project_id>\d+)/[A-z\\-]{0,50}$',
                       views.project_detail, name='project_detail`),

然后在redirect()调用中引用这个名字:

return redirect('project_detail', project_id=project.pk, permanent=True)

【讨论】:

  • 太棒了。我将 pk 更改为 project_id,就像@DanielRoseman 建议的那样。它之前在做什么?
猜你喜欢
  • 2015-10-16
  • 2015-01-13
  • 2021-09-29
  • 2015-04-24
  • 1970-01-01
  • 2021-12-27
  • 2015-03-09
  • 2019-08-12
  • 2015-12-11
相关资源
最近更新 更多