【问题标题】:How use Json variable in Django Template Tags?如何在 Django 模板标签中使用 Json 变量?
【发布时间】:2021-03-21 17:56:28
【问题描述】:

如何在 srcipts 的 Django 模板标签中使用 json 变量? 当我使用 django 模板标签和我自己的自定义标签时,我不能在 javascript 字符串中使用变量,例如: {% if ${comment}|comment_like_ip:ip %}

$(document).ready(function(){

    const comments = document.getElementById('comments')
    const loadBtn = document.getElementById('load-btn')
    const loadBox = document.getElementById('loadBox')
    let visible = 3

    vis = {
        num : visible,
    }

    let handleGetData = () => {
        $.ajax({
            type: 'GET',
            data: vis,
            url: "{% url 'load-comments' video.slug %}",
            success: function(response) {
                max_size = response.max
                const data = response.data
                console.log(data)
                data.map(comment=>{
                    console.log(comment.id)
                    if(comment.is_child) {
                        comments.innerHTML += `<div class="comment">
                                                ${comment.nickname} | ${comment.timestamp}
                                                <div style="background-color: black; width: 300px;">
                                                    <p>Ответ: ${comment.parent_name}</p>
                                                    <p>Комментарий: "${comment.parent_text}"</p>
                                                </div>
                                                <p>${comment.text}</p>
                                                <p><a href="#" class="like-comment" data-id="${comment.id}">
                                                    {% if ${comment}|comment_like_ip:ip %}
                                                    <i class="fas fa-heart" style="color: #BE0E61;"></i>
                                                    {% else %}
                                                    <i class="far fa-heart"></i>
                                                    {% endif %}
                                                    <span>${comment.likes}</span></a></p>
                                                <button style="background-color: black;" class="reply" data-id="${comment.id}" data-parent=${comment.get_parent}>Ответить</button>
                                                <form action="" method="POST" class="comment-form" id="form-${comment.id}" style="display:none;">
                                                    <textarea type="text" name="comment-text">
                                                    </textarea>
                                                    <br>
                                                    <input type="submit" class="btn submit-reply" data-id="${comment.id}" data-submit-reply="${comment.get_parent}" value="Отправить"/>
                                                </form>
                                            </div>`
                    } else {
                        comments.innerHTML += `<div class="comment">
                                                ${comment.nickname} | ${comment.timestamp}
                                                <p>${comment.text}</p>
                                                <p><a href="#" class="like-comment" data-id="${comment.id}">
                                                    {% if True %}
                                                    <i class="fas fa-heart" style="color: #BE0E61;"></i>
                                                    {% else %}
                                                    <i class="far fa-heart"></i>
                                                    {% endif %}
                                                    <span>${comment.likes}</span></a></p>
                                                <button style="background-color: black;" class="reply" data-id="${comment.id}" data-parent=${comment.get_parent}>Ответить</button>
                                                <form action="" method="POST" class="comment-form" id="form-${comment.id}" style="display:none;">
                                                    <textarea type="text" name="comment-text">
                                                    </textarea>
                                                    <br>
                                                    <input type="submit" class="btn submit-reply" data-id="${comment.id}" data-submit-reply="${comment.get_parent}" value="Отправить"/>
                                                </form>
                                            </div>`
                    }
                       
                }) 
                if(max_size) {
                    console.log('Done')
                }
            },
            error: function(error){
                console.log(error)
            }
        })
    }

    handleGetData()
    loadBtn.addEventListener('click', ()=>{
        visible += 3
        vis = {
            num : visible,
        }
        handleGetData()
    })
})

错误:无法解析某些字符:|${comment}||comment_like_ip:ip

我的自定义模板标签:

@register.filter
def comment_like_ip(value, arg):
    if CommentLike.objects.filter(ip__ip=arg).filter(comment__id=value).exists():
        return True
    else:
        return False

【问题讨论】:

标签: javascript python json django


【解决方案1】:

您需要为模板引擎创建一个字符串:

{% if '${comment}'|comment_like_ip:ip %}

编辑:我以为你试图用这个生成 JavaScript 代码。你需要明白,django-templates 和 js 是完全独立的层。

JS 位于 客户端 端。

Django 位于 服务器 端。

当您在 JS 中设置变量时,就像上面的示例一样,会发生这种情况...

  • django 的模板渲染完成后的方式。
  • 在用户的计算机上,在他们的浏览器中,而不是在您的服务器上。

我会将该过滤器实现为 js 函数并让它在客户端运行。如果你真的需要服务器来做那个计算,你可以在服务器上为它创建一个 API 并使用 fetch 从 js 调用该 API,或者你可以预先进行计算并将其结果保存为评论对象的属性。

【讨论】:

  • 我做了这个:{% if '${comment.id}'|comment_like_ip:ip %},并在我的模板标签中出错:Field 'id' expected a number but got '${comment.id}'.。我在帖子中添加了上面的自定义过滤器
  • 查看我的编辑。你不能在 Django 的模板中使用来自 JS 的变量。
猜你喜欢
  • 1970-01-01
  • 2021-06-02
  • 2014-08-09
  • 2016-11-21
  • 2013-05-12
  • 1970-01-01
  • 2018-03-19
  • 2018-12-20
相关资源
最近更新 更多