繁体   English   中英

在Ajax URL中获取Django项目ID

[英]Get Django Item ID In Ajax URL

我在项目编辑页面中有一个选择框,我想通过Ajax调用填充保存的值。

<script type="text/javascript">
    $(document).ready(function() {
        $('#editPrefabLineclassBox').on('change', function() {
            var selected = this.value;
                $.ajax({
                    url: '/edit-prefab/,
                    type: 'POST',
                    data: {
                        csrfmiddlewaretoken: '{{ csrf_token }}',
                        lineclassSelected: selected
                    },
                    success: function(data) {
                        var name, select, option;
                        select = document.getElementById('editPrefabNameBox');
                        select.options.length = 0;
                        for (name in data) {
                            if (data.hasOwnProperty(name)) {
                                select.options.add(new Option(data[name], name));
                            }
                        }
                    }
                });
            });
        })
</script>

我在通话中使用的网址是/ edit-prefab /。 我遇到的问题是,Django中页面的URL实际上是/ edit-prefab / {{material_item.id}},只有我不确定如何将此ID传递给javascript以在Ajax调用中使用。 仅使用/ edit-prefab /,找不到该页面。

在用项目列表填充select之后,我想预先选择要编辑的项目的保存值。 我确信我可以根据需要填充所有内容。 只是URL的设置让我有些困惑

我试图通过JSON.dumps通过视图将项目的ID传递到模板,然后解析JS中的变量以在url中使用,但是我在解析时始终遇到意外的列错误,因为据我所知可以使用JSON正确解析字典。

有谁可以帮忙吗?

编辑:

def editprefabitem(request, materialitem_id):
    context = dict()
    mat_item = MaterialItem.objects.get(id=materialitem_id)

    context['itemid'] = json.dumps(mat_item.id)    
    context['lineclass'] = json.dumps(mat_item.lineclass)
    context['itemname'] = json.dumps(mat_item.name)
    context['diameter'] = json.dumps(mat_item.diameter)
    context['quantity'] = json.dumps(mat_item.quantity)

    if request.method == 'POST':
        if 'lineclassSelected' in request.POST:
            lclass = Lineclass.objects.filter(lineclassname=request.POST['lineclassSelected'])\
            .values_list('itemname', flat=True).distinct()
        request.session['lineclassselected'] = request.POST['lineclassSelected']
        lineclass = valuesquerysettodict(lclass)
        return HttpResponse(json.dumps(lineclass), content_type='application/json')

    if 'itemSelected' in request.POST:
        item = Lineclass.objects.filter(itemname=request.POST['itemSelected'])[0]
        diams = Lineclass.objects.filter(itemname=item.itemname).values_list('dn1', flat=True).distinct()
        request.session['itemselected'] = request.POST['itemSelected']
        diameters = valuesquerysettodict(diams)
        return HttpResponse(json.dumps(diameters), content_type='application/json')

    if 'diamSelected' in request.POST:
        request.session['diameterselected'] = request.POST['diamSelected']

    if 'editPrefabQuantityBox' in request.POST:
        code = Lineclass.objects.filter(lineclassname=request.session['lineclassselected'])\
            .filter(itemname=request.session['itemselected']).filter(dn1=request.session['diameterselected'])[0]\
            .code

        mat_item.name = request.session['itemselected'],
        mat_item.type = 'Prefabrication',
        mat_item.lineclass = request.session['lineclassselected'],
        mat_item.diameter = request.session['diameterselected'],
        mat_item.quantity = request.POST['editPrefabQuantityBox'],
        mat_item.workpack = Workpack.objects.get(id=request.session['workpackselected']),
        mat_item.code = code,
        mat_item.datecreated = datetime.datetime.today(),
        mat_item.createdby = request.user.username

        mat_item.save()
        return HttpResponseRedirect('/prefabs/')

return render_to_response('editprefab.html', context, context_instance=RequestContext(request))

context ['itemid'],context ['lineclass']等是在其中获取项目的当前值,并尝试将其发送到要由javascript解析的模板,以设置默认值以便在选择框,然后在网址中提供商品ID。

我发现的valuesquerysettodict()函数是一个小片段,用于将Models values_list转换为JSON可序列化dict,以基于从Ajax发送来的参数填充选择。 我使用它的原因是,如果我返回Lineclass.objects.all(),则查询集中有很多项目,它们具有相同的名称,但项目代码不同,所以我正在使用values_list尝试获取唯一的项目选择要使用的名称。

我确定我在某个地方出错,只是不确定在哪里。

感谢您提供的任何帮助。

因此,我假设您是通过单击“提交”按钮来进行AJAX呼叫的。 无论哪种方式,都可以在任何标签的value属性中提供Django变量,并像这样检索它。

在您的提交按钮的value属性中,按以下方式传递Django ID:

<button type="submit" value="{{ material_item.id }}" id="submit-button"></button>现在,在您的AJAX请求中,您可以检索ID并将其与您的AJAX请求一起发送这个:

$(document).ready(function(event){ 
    $(document).on('click', '#submit-button' , function(event){
    event.preventDefault();
    var pk = $(this).attr('value');
    data:{
         'id': pk,
    }
    ....
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM