【问题标题】:Using django url in Ajax is returning a string在 Ajax 中使用 django url 返回一个字符串
【发布时间】:2016-03-21 18:17:08
【问题描述】:

在 AJAX get 调用中使用 {% url 'query' %} 时返回一个字符串,但是当我放置一个静态 url 时它可以正常工作。

我在已安装的应用程序中使用 Django-Filters 和 Django-rest-framework。

url.py

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^query/$', 'my_app.views.app_function', name='query')
]

app.js

$(document).ready(function(){

// LOAD COOKIE
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');


function callServer () {
    $.ajax({
        type: 'GET',
        url: "{% url 'query' %}",
        success: function (json) {
            console.log(json)

        },
        error: function(x, t, m) {
            if(t==="timeout") {
                alert("got timeout");
            } else {
                alert(t);
            }
        },
        headers: {
            'X-CSRFToken': csrftoken
        }
    });
}

$("#query").click(function () {
    $('#sub').submit(function (e) {
        e.preventDefault();
    });
    return callServer();
});



});

views.py

class AppFilter(django_filters.FilterSet):
    class Meta:
        model = Post
        fields = ['first', 'second']


@api_view(['GET'])
def app_function(request):
    qs = Post.objects.all()
    f = AppFilter(request.GET, queryset=qs)
    serializer = PostSerializer(f, many=True)
    return Response(serializer.data)

forms.py

class QueryForm(forms.Form):
    first = forms.TypedChoiceField(
        widget=forms.Select, 
        choices=choice_dict1
    )
    second = forms.TypedChoiceField(
        widget=forms.Select, 
        choices=choice_dict2
    )

在我烧掉这个地方之前有什么帮助吗?

【问题讨论】:

    标签: python ajax django


    【解决方案1】:

    Django 无法解析 JS 文件中的 {% url 'query' %},因为那是客户端的东西。反向 url 在 html 文件渲染时被解析。

    您可以做的是,将该 url 作为该 JS 模块的 init() 函数从 html 文件传递​​:

    <!-- In your Template file -->
    <script>
    $(function(){
        app.init("{% url 'query' %}");
    });
    </script>
    

    并从 js 文件中导出 app 模块。将该 url 设置为变量,并在 ajax 调用中使用它。

    【讨论】:

    • 也可以将那段 JS 添加到模板文件中
    • 该死...你打字比我快:-)
    • @dietbacon 该脚本标签将仅出现在模板文件中。
    • “从 js 文件中导出应用模块”是什么意思。意思是?如何将名为 app.js 的 Javascript 文件导出到 Django 模板?
    【解决方案2】:

    问题是您的 javascript 文件 (app.js) 可能不是模板。您没有显示它,但我假设您有一个正在加载 app.js 文件的 HTML 文件。 HTML 文件是模板变量等将被扩展的地方。解决此问题的最简单方法是将 javascript 代码嵌入到 HTML 文件中的 &lt;script&gt; 标记内。

    有一个名为 Flask-JSGlue 的 Flask 库可以解决这个问题,并允许您在 javascript 文件中使用模板变量,但我找不到类似的 Django 库。

    【讨论】:

    • 谢谢你们两位的回答。
    猜你喜欢
    • 2020-08-13
    • 2019-10-28
    • 1970-01-01
    • 2018-09-06
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多