所以我想知道你是否可以直接从视图中返回包含标记。
该页面是包含项目列表的普通页面。使用包含标记呈现项目列表。如果对视图发出ajax请求,我只想返回包含标记将返回的内容,以便我可以通过javascript将其附加到页面上。这样的事情可能吗?或者我应该更好地设计这个?
答案 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))
简单比复杂更好。