使用AJAX更新django if-else模板

时间:2017-03-22 08:18:12

标签: ajax django django-templates

在模板中我有:

{% 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声明处理什么?

谢谢

2 个答案:

答案 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视图返回布尔值,然后根据该值在前端代码中设置图像。