我想根据用户选择来获取数据库对象。我知道一个可能的解决方案可能是Ajax,但我不知道如何解决它。这是代码:
view.py:
def automation(request):
//some code
car = CAR.objects.get(ida_name='honda')
model = car.model_set.all()
//some code
template.html:
Select CAR: <select id="car" name="car">
{% for car in car_list %}
<option value="{{ car.id }}" id="{{ car.id }}">{{ car.car_name }}</option>
{% endfor %}
</select>
Select car model: <select id="model" name="model">
{% for model in car.model_set.all %}
<option value="{{ forloop.counter }}">{{ model.model_name }}</option>
{% endfor %}
</select>
在这里,我想传递一个名字,例如。&#39; honda&#39;从我的模板(一旦用户在下拉列表中选择它)到我的view.py,然后获取相应的对象并将结果返回到我的模板&#39; model&#39;下拉列表。 (因此,当用户从汽车下拉列表中选择任何汽车时,基本上汽车模型列表会刷新)
注意:模型与models.py中的Car存在多对多关系
我被困在这里很长时间,任何帮助都会非常感激。
答案 0 :(得分:4)
您可以使用AJAX回调Django代码并返回您的汽车名称:
template.html
$(document).ready(function () {
$(document).on("click",'.car_add', function() {
$car_id = $(this).attr('id')
$.ajax({
type: "POST",
// This is the dictionary you are SENDING to your Django code.
// We are sending the 'action':add_car and the 'id: $car_id
// which is a variable that contains what car the user selected
data: { action: "add_car", id: $car_id },
success: function(data){
// This will execute when where Django code returns a dictionary
// called 'data' back to us.
$("#car").html("<strong>"+data.car+"</strong>");
}
});
});
});
views.py
def post(self,request, *args, **kwargs):
if self.request.is_ajax():
return self.ajax(request)
def ajax(self, request):
response_dict= {
'success': True,
}
action = request.POST.get('action','')
if action == 'add_car':
car_id = request.POST.get('id','')
if hasattr(self, action):
response_dict = getattr(self, action)(request)
car = CAR.objects.get(ida_name='car_id')
response_dict = {
'car_name':car.name
}
return HttpResponse(simplejson.dumps(response_dict),
mimetype='application/json')
总而言之,这就是你正在做的事情:
如果您想查看明确的示例,请参阅此Link
答案 1 :(得分:0)
我将假设您正在使用AJAX请求。
您无法直接将查询结果或模型实例作为JSON返回。但你可以序列化它。这是一种可能性:
from django.forms.models import model_to_dict
model_to_dict(intance, fields=[], exclude=[])
model_to_dict
需要3个参数:
参数2和3是可选的。如果未指定字段,则该方法将序列化所有字段。要为多个实例(例如查询结果)执行此操作,只需在每个实例的循环中执行此操作。