Django - 从视图中渲染包含标记

时间:2010-08-18 15:51:54

标签: django django-templates

所以我想知道你是否可以直接从视图中返回包含标记。

该页面是包含项目列表的普通页面。使用包含标记呈现项目列表。如果对视图发出ajax请求,我只想返回包含标记将返回的内容,以便我可以通过javascript将其附加到页面上。这样的事情可能吗?或者我应该更好地设计这个?

6 个答案:

答案 0 :(得分:2)

这听起来像是render_to_string或render_to_response快捷方式的工作:
https://docs.djangoproject.com/en/dev/ref/templates/api/#the-render-to-string-shortcut
https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.render_to_response

我们仍然可以使用包含标记从我们的args生成模板上下文字典(正如@ BobStein-VisiBone在评论中指出的那样)

from django.template.loader import render_to_string
from django.shortcuts import render_to_response

from .templatetags import my_inclusion_tag


rendered = render_to_string('my_include.html', my_inclusion_tag(foo='bar'))

#or

def my_view(request):
    if request.is_ajax():
        return render_to_response('my_include.html',
                      my_inclusion_tag(foo='bar'),
                      context_instance=RequestContext(request))

答案 1 :(得分:1)

我今天试图做同样的事情,最后写了一个帮助函数来渲染模板标签:

def render_templatetag(request, tag_string, tag_file, dictionary=None):
    dictionary = dictionary or {}
    context_instance = RequestContext(request)
    context_instance.update(dictionary)
    t = Template("{%% load %s %%}{%% %s %%}" % (tag_file, tag_string))
    return t.render(context_instance)

tag_string是对模板标记的调用,因为它出现在普通模板中,而tag_file是您需要为模板标记加载的文件。

答案 2 :(得分:0)

这当然是可能的。视图可以呈现包含标记可以包含的任何模板。这种方法的优点是你可以利用Django模板的全部优势。

另一方面,AJAX响应通常不包含HTML,就像XML / JSON一样。如果您使用Django的模板功能,那么返回HTML会更好。如果没有,XML / JSON可能更有意义。只是我的两分钱。

答案 3 :(得分:0)

快速而肮脏的方式可能是创建一个只包含模板标签的视图。

答案 4 :(得分:0)

使用inclusion tag with configurable template decorator provided by Gonz代替默认的Django包含标记,您可以在视图中编写帮助程序:

from django.template.loader import render_to_string
from home.templatetags.objectwidgets import object_widget

def _object_widget(request, obj):
    template, context = object_widget(RequestContext(request), obj)
    return render_to_string(template, context)

它是DRY并与Django 1.3一起使用(我没有使用Django 1.4进行测试)。

我使用这种技术通过JSON / AJAX调用返回以HTML格式呈现的搜索结果(我提出的更好)。

答案 5 :(得分:0)

这是可能的,但可能有点hacky,复杂或复杂。

我建议的是构建它,以便在utils.py函数中使用渲染部分,并在simple_tag而不是inclusion_tag中使用它。这样,您就可以在视图中轻松使用相同的utils渲染功能。

在我的(非常简化的)虚构示例中,我列出了用户和"加载更多"返回更多用户的按钮。

帐户/ utils.py

from django.template.loader import render_to_string


def render_users(users):
    return render_to_string("account/user_list_items.html", {"users": users})

帐户/ templatetags / account_tags.py

from django import template

from ..utils import render_users

register = template.Library()


@register.simple_tag
def list_users(users):
    return render_users(users)

帐户/ views.py

from django.http import HttpResponse

from .models import User
from .utils import render_users


def load_more_users(request):
    limit = request.GET["limit"]
    offset = request.GET["offset"]
    users = User.objects.all()[offset:offset + limit]
    return HttpResponse(render_users(users))

简单比复杂更好。