Django- много-много запросов к полю
У меня есть следующая структура моделей в Django:
class BodySubPart(models.Model):
body_subpart=models.CharField(max_length=20)
def __str__(self):
return self.body_subpart
class BodyPart(models.Model):
body_part=models.CharField(max_length=20)
body_subpart=models.ManyToManyField(BodySubPart)
def __str__(self):
return self.body_part
Пример:
example,
if BodyPart=head then BodySubPart= face,mouth,eyes,nose.
if BodyPart=arm then BodySubPart= shoulder,fingers,elbow.
как это много частей тела хранятся.... теперь я хочу создать форму времени выполнения, имеющую два поля выбора (BodySubPart и BodyPart), так что когда я выбираю BodyPart, он должен изменить список в BodySubPart. Ex.
The first choicefield has body parts={head,arm,chest...}
The second choice field should change when i select a particular part
If i select "head" then second choice field should show,
body sub parts={face,mouth,eyes,nose...}
Пожалуйста, помогите мне здесь.....
3 ответа
Это требует немного AJAX, поэтому первым шагом является создание представления для обработки этого:
from django.core import serializers
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import get_list_or_404
def ajax_get_bodysubparts(request):
bodypart_id = request.GET.get('bodypart_id')
if bodypart_id:
bodysubparts = get_list_or_404(BodySubPart, bodypart__id=bodypart_id)
data = serializers.serialize('json', bodysubparts)
return HttpResponse(data, mimetype='application/json')
else:
return HttpResponseBadRequest()
Привяжите это к некоторому URL в urls.py. Затем немного JavaScript для вашей формы (предполагается, что jQuery):
$(document).ready(function(){
$('#id_bodypart').change(function(){
var selected = $(this).val();
if (selected) {
$.getJSON('/url/to/ajax/view/', {
'bodypart_id': selected
}, function (data, jqXHR) {
options = [];
for (var i=0; i<data.length; i++) {
options.append('<option value="'+data[i].id+'">'+data[i].body_subpart+'</option>');
}
$('#id_bodysubpart).html(options.join(''));
});
}
});
});
Что ты пробовал?? Я думаю, вы обнаружите, что люди охотнее вам помогут, если вы действительно попробовали что-то сами, а не просто хотите, чтобы другие сделали это для вас. Это должно пойти примерно так:
1) BodyPart.objects.all() # all body parts
2) head = BodyPart.objects.get(body_part='head')
head_subparts = head.body_subpart.all() # all head subparts
Django делает большую работу, объясняя, как запросить эти отношения. https://docs.djangoproject.com/en/dev/topics/db/models/ Кроме того, в Интернете есть множество действительно полезных уроков, касающихся многодетных отношений djangos.
Вам, вероятно, понадобится комбинация настраиваемых полей формы и виджетов, чтобы получить то, что вы хотите.
Проверьте проект http://code.google.com/p/django-ajax-filtered-fields/, чтобы увидеть, если это близко к тому, что вы ищете. По крайней мере, он даст некоторые рекомендации, если вы решите создать свой собственный.
Вам понадобится некоторый JavaScript, чтобы сделать новый запрос для динамического заполнения ваших полей, чтобы он также не был доступен со стандартными формами django.