Django重定向调用将包名附加到url

时间:2015-01-20 09:25:54

标签: python django django-forms django-views

我正在编写一个用于在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定义,我唯一的猜测就是它会降到最低点,它只是按原样返回。为什么不进行查找?

ED:

以下是该应用的网址模式:

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), 
    )

1 个答案:

答案 0 :(得分: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)