在Ajax URL中获取Django项ID

时间:2015-01-15 12:38:42

标签: javascript ajax django

我在项目编辑页面中有一个选择框,我希望通过带有保存值的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 /,找不到页面。

在使用项目列表填充选择后,我想预先选择正在编辑的项目的已保存值。我相信我可以根据需要填充所有内容。它只是设置了让我有点困惑的网址

我已经尝试通过视图将项目的id传递给带有JSON.dumps的模板,然后解析JS中的变量以在url中使用,但是在解析时我不断收到意外的列错误,因为从什么我知道只有一个dict可以用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))

上下文[&#39; itemid&#39;],上下文[&#39; lineclass&#39;]等,是我抓取项目的当前值并尝试将它们发送到模板的位置通过javascript解析,在选择框中设置编辑的默认值,并在网址中提供项目ID。

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

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

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

因此,我假设您是通过单击“提交”按钮来进行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,
    }
    ....
    });
});