我在项目编辑页面中有一个选择框,我希望通过带有保存值的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一起使用的名称。
我确定我在某个地方出错了,我不确定在哪里。
感谢您提供的任何帮助。
答案 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,
}
....
});
});