我在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中的列表。
实施例
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...}
请在这帮帮我.....
答案 0 :(得分:1)
你有什么尝试?我想你会发现,如果你自己尝试过一些东西而不仅仅是希望别人为你做这件事,那么人们会更愿意帮助你。它应该是这样的:
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/#many-to-many-relationships 此外,还有很多关于djangos的多种关系的在线教程。
答案 1 :(得分:1)
这需要一些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()
将其与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(''));
});
}
});
});
答案 2 :(得分:0)
您可能需要自定义表单字段和小部件的组合才能获得所需内容。
查看django-ajax-filtered-fields项目,看看它是否接近你要找的东西。如果你决定创建自己的,它至少会提供一些指导。
您需要一些javascript来发出动态填充字段的新请求,因此标准django表单也无法使用。