4

为什么

<a href="{% url 'answers.views.display_answers' Question.id %}">View answers</a>

在我的模板中翻译成 Django 的这种解释:

Request URL:    http://127.0.0.1:8000/questions/%7B%%20url%20'answers.views.display_answers'%20Question.id

这当然会导致 url 不匹配错误。

似乎它以 ASCII 形式在我的“{”中读取。谁能告诉我为什么会这样?

编辑:

这就是我渲染模板的方式——

return render(request, 'display_questions.html', context) 

并且模板包含href。我的显示答案视图重定向到另一个视图,如下所示:

def display_answers(request, q_id): 
        q = get_object_or_404(Question, id=q_id) 
        ans_list = Answer.objects.filter(question=q) 
        context = {'question': q, 'ans_list': ans_list} 
        return redirect('view_answers.html', context)

错误:

当前 URL,questions/{% url 'answers.views.display_answers' Question.id,与其中任何一个都不匹配。

4

3 回答 3

3

这是对的。如果不是 - 你urls.py似乎错了。请张贴。

<a href="{% url answers.views.display_answers question.id %}">View answers</a>

编辑 这是您视图的更好版本。

from django.template import RequestContext
from django.core.urlresolvers import reverse
from django.shortcuts import render_to_response, redirect, get_object_or_404

def display_answers(request, q_id): 
    q = get_object_or_404(Question, id=q_id) 
    ans_list = Answer.objects.filter(question=q) 
    context = {'question': q, 'ans_list': ans_list} 
    return render_to_response('view_answers.html', context, RequestContext(request))
于 2012-10-12T18:38:42.973 回答
0

问题是您redirect在视图中的使用。你应该使用renderorrender_to_response除非你真的想重定向浏览器。(使用 Fiddler、Firebug 或 Chrome 的开发人员工具进行观察,您会看到它正在重定向。)

这不是很明显的问题的原因是因为redirect可能将 URL 作为其第一个参数。'view_answers.html'被解释为相对 URL,它可能映射到 URLconf 中的 URL,也可能不映射。如果它确实映射到一个 URL,那么您会得到一个误报结果,表明一切似乎都在工作,但是如果您的 Web 服务器处理该链接而不是 Django,那么它可能只是以纯文本形式发送回模板页面。正如我所说的,解决方案是要么render渲染render_to_response页面,要么redirect使用视图名称或 URL 模式的特殊名称重定向到不同的视图。

于 2012-10-12T19:05:02.140 回答
0

Modify your redirect in your display_answers view to use the name of the view, instead of the name of your template (view_answers.html) and don't pass it the context (redirect doesn't take the context as a parameter):

return redirect('your_view_answers_view')
于 2012-10-12T19:05:16.820 回答