【问题标题】:Django- Many to Many field queryingDjango-多对多字段查询
【发布时间】:2012-02-07 18:07:38
【问题描述】:

我在 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...}

请帮帮我.....

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案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 多对多关系的非常棒的在线教程。

    【讨论】:

      【解决方案2】:

      这需要一点 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 中的某个 URL。然后,为您的表单添加一些 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(''));
                  });
              }
          });
      });
      

      【讨论】:

        【解决方案3】:

        您可能需要自定义表单字段和小部件的组合来获得您想要的。

        查看django-ajax-filtered-fields 项目,看看它是否与您正在寻找的相近。如果您决定创建自己的,它至少会提供一些指导。

        您将需要一些 javascript 来发出新请求以动态填充您的字段,因此标准 django 表单也无法使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-25
          • 2013-05-17
          相关资源
          最近更新 更多