【问题标题】:Create a django url with ajax results使用 ajax 结果创建一个 django url
【发布时间】:2019-08-31 18:45:47
【问题描述】:

我正在使用 AJAX 通过 dataTable 刷新模板中的表格。 当我从 AJAX 调用 (json) 获得结果时,我使用“列”来设置每一行。在其中一行中,我想创建一个指向另一个视图的 Django URL。

到目前为止我尝试过的方法似乎不起作用

function refreshData(event_ref) {
    var table = $('#datatable').dataTable({
        'processing': true,
        'serverSide': false,
        'responsive': true,
        'destroy': true,
        'ajax': {   
            'type': "GET",
            'url': "{% url 'events:index' %}",
            'dataSrc': ""
        },
        'columns': [
            { "data": "pk", render: function (pk) { return '<input type="checkbox" id="check_' + pk + '" name="check_all">'} },
            { "data": "fields.date_time" },
            { "data": "pk", render: function (pk) { return "<a href='{% url 'events:event' " + pk + "%}'>Click me</a>" }} 
        ],
        'order': [[ 2, "desc" ]],
        'columnDefs': [ {
            'targets': [0, 8], // column index (start from 0)
            'orderable': false, // set orderable false for selected columns
        }],
        'scroller': {
            loadingIndicator: true
        }
    });
}

问题出在一行

{ "data": "pk", render: function (pk) { return "<a href='{% url 'events:event' " + pk + "%}'>Click me</a>" }} 

我得到的是这个, 未找到带有参数“(”+ pk+“,)”的“事件”的反向。尝试了 1 种模式:['events/event/(?P[0-9]+)/']

我的 urls.py 文件是这个

url('event/(?P<event_id>[0-9]+)/', views.event, name='event'),

我的 view.py 就是这个

def index(request):

    latest_event_list = events.objects.order_by('-date_time')

    if request.is_ajax():
        json = serializers.serialize('json', latest_event_list)
        return HttpResponse(json, content_type='application/json')

    template = loader.get_template('events/index.html')

    context = {
        'app_name': "events",
        'page_name': "real-time",
        'latest_event_list': latest_event_list,
        'total_events': len(latest_event_list)
    }
    return HttpResponse(template.render(context, request))

def event(request, event_id):

    latest_event_list = events.objects.order_by('-date_time')[:5]
    template = loader.get_template('events/event.html')
    context = {
        'app_name': "events",
        'page_name': "archive",
        'latest_event_list': latest_event_list,
    }

    return HttpResponse(template.render(context, request))

如何使用来自 AJAX 调用的值创建 Django URL?

【问题讨论】:

    标签: ajax django django-templates


    【解决方案1】:

    首先,将参数传递给{% url %} 模板标签不是通过附加字符串来完成的,要在模板中获取您想要的url,您可以这样做:

    {% url 'events:event' event_id=pk %}
    

    其次,您在 HTML 中使用的任何模板标签在呈现 HTML 页面时都会在后端由 Django 解释一次。也就是说,在它到达浏览器和 javascript 开始运行之前(前端)。所以你在做什么没有意义,因为你希望 javascript 动态改变按钮中的 url。

    如果您在浏览器中查看 HTML 的源代码,您会发现没有模板标签。

    所以你必须在 javascript 中构造 url。你可以做的是在你的模板中创建一个javascript变量"{% url 'events:event' event_id=1 %}"(在浏览器解析的HTML文件中是events/event/1,然后使用字符串操作将“1”替换为pk的值。

    【讨论】:

    • 你说得对,javascript是前端语言,谢谢你的帮助
    【解决方案2】:

    你捕捉到错误是因为在 pk 未定义时调用标签,所以你可以通过使用一些基本 url 来修复它,然后用当前值替换 pk,例如:

    {
      var base_url = "{% url 'events:event' 0 %}";
      var url = base_url.substring(0, base_url.lastIndexOf('/') +1 ) + pk;
      return "<a href='" + url + "'>Click me</a>" 
    }
    

    【讨论】:

    • 我宁愿使用替换而不是子字符串,但你的答案是正确的:
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2021-01-04
    相关资源
    最近更新 更多