我正在尝试实现ajax视图来创建一个对象,然后将其返回并将其插入到模板中。它几乎正常工作,除了我似乎无法使render_to_string()工作以呈现要插入的html。正在创建对象并返回html并将其插入到模板中,但是变量不包含在html中。我的观点如下。
def tr_create_xhr(request, person, slug):
if request.method == "POST":
form = TopicResourceForm(request.POST)
if form.is_valid():
try:
r = Resource.objects.get(url=form.cleaned_data['resource'])
except Resource.DoesNotExist:
r = Resource.objects.create(url=form.cleaned_data['resource'], rtype=form.cleaned_data['rtype'])
r.save()
obj = form.save(commit=False)
obj.resource = r
try:
topic = Topic.objects.get(person__user=request.user, slug__iexact=slug)
except Topic.DoesNotExist:
return Http404
obj.topic = topic
objs = obj.save()
html = render_to_string('includes/tr_inc.html',{"r":objs, "topic":topic})
res = {'html':html}
if request.is_ajax():
return HttpResponse(simplejson.dumps(res), mimetype="application/json")
else:
return HttpResponseRedirect("../..")
return Http404
这是模板“includes / tr_inc.html”:
{% load markup %}
{% load people_tags %}
<li>
<h5>{{ r.title }}</h5>
<p><a class="tru" href={{ r.resource.url }}>{{ r.resource.url|sliceit:70 }}</a></p>
<span class="oc"><p>Added {{ r.added }}{% if r.rtype %} |<a href={% url resource_type_detail r.rtype.slug %}>{{ r.rtype }}</a>{% endif %}
| <a href="/topics/user/{{ r.topic.person.user }}/{{ r.topic.slug }}/topic-resource/delete/{{ r.id }}/">Delete</a> <a href="/topics/user/{{ r.topic.person.user }}/{{ r.topic.slug }}/topic-resource/edit/{{ r.id }}/">Edit</a>
{{ r.note|markdown }}</span>
</li>
返回的html字符串是没有插入任何变量的模板。
答案 0 :(得分:1)
模型方法'save'不返回对象。所以你'objs'变量是空的。你应该写
html = render_to_string('includes/tr_inc.html',{"r":obj, "topic":topic})
答案 1 :(得分:1)
我今天遇到了同样的问题。这很容易。请检查Django文档中的此方法,实际上有第三个可选参数:context_instance=RequestContext(request)
。因此,render_to_string
应该是这样的:
html = render_to_string(
'includes/tr_inc.html',{"r":obj, "topic":topic},
context_instance=RequestContext(request))
然后一切都应该正常运作。