[英]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.