在视图中返回函数调用而不是HTTP响应

时间:2012-06-22 22:29:58

标签: django django-views

我认为我没有看到任何说你不允许这样做的事(或你的确是这样),但你有什么理由不应该这样做吗?它似乎工作正常。

def get_page(request, topic_slug = 'home', tag_slug = None, form = None):

    #...

    if form is None:
        form = CommentForm()
    d = {'topic':topic, 'topics':topics, 'tags':tags, 'comments':comments, 'form':form}

    d.update(csrf(request))
    return render_to_response('page.html', d)

def save_comment(request, topic_slug):

    if request.method == 'POST':
        form = CommentForm(request.POST)

        if form.is_valid():
            #...save
        else:
            kwargs = {'topic_slug':topic_slug}
            kwargs['form'] =form
            return get_page(request, **kwargs) #<-------------- this

    return HttpResponseRedirect(reverse('get_page', kwargs = {'topic_slug':topic_slug}))

1 个答案:

答案 0 :(得分:1)

render_to_response只是一个捷径。调用它的结果仍然是HttpResponse的实例。

作为证据,请参阅Django源代码中的render_to_response()声明:

def render_to_response(*args, **kwargs):
    """
    Returns a HttpResponse whose content is filled with the result of calling
    django.template.loader.render_to_string() with the passed arguments.
    """
    httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
    return HttpResponse(loader.render_to_string(*args, **kwargs),
        **httpresponse_kwargs)

非常不言自明。

写下这个:

return get_page(request, **kwargs)

你实际上做了类似的事情:

return render_to_response(request, kwargs)

(但稍微修改了kwargs参数)。