在模板中我有:
{% for item in items %}
{% if item.public is True%}
<a href="{% url 'motifapp:article_public_edit' article.id %}">
show icon1
</a>
{% else %}
<a href="{% url 'motifapp:article_public_edit' article.id %}">
show icon2
</a>
{% endif %}
{endfor}
我在这里使用ajax处理请求:
$(anchor).click(function(e){
e.preventDefault();
var href = $(this).attr('href')
$.ajax({
type: 'POST',
url: href,
data: {csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),},
success: function (response) {
//refresh a div ?
}
});
});
Ajax处理帖子,并在视图中反转布尔值&#39; public&#39;。 问题是,我该如何更新模板?我可以传递相反的图标和价值,但它似乎非常多余。有没有办法只用锚点刷新那个div,让if else声明处理什么?
谢谢
答案 0 :(得分:1)
你99%接近回答你自己的问题。
首先,您必须将{% for %}
包装在div中并将其另存为单独的文件,例如:
<!-- injection.html -->
<div id="some-id>
{% for item in items %}
same code here
{% endfor %}
</div>
现在,在您的主模板中,您应该include
这样的文件:
<div id="wrapper">
{% include 'templates/injection.html' %}
</div>
现在,一旦你向views
函数发出了一个AJAX请求,那么这个视图应该render
div(这是一个单独的html文件)但是与另一个{ {1}}价值。像这样:
items
最后,您可以在# views.py
def article_public_edit(request, id):
if request.is_ajax():
# new calculation of the items QuerySet
# depending on the data passed through the $.ajax
return render(request, 'injection.html', locals())
$.ajax()
函数中执行此操作:
success
答案 1 :(得分:1)
使用ajax调用,无法重新评估Django模板标记。它们仅在初始页面加载时得到评估。
我认为最好的方法是让ajax视图返回布尔值,然后根据该值在前端代码中设置图像。