Django - много-много запросов к полю - PullRequest
0 голосов
/ 07 февраля 2012

У меня есть следующая структура моделей в 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...}

Пожалуйста, помогите мне здесь .....

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

Для этого требуется немного 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 голос
/ 07 февраля 2012

Что вы пробовали ?? Я думаю, вы обнаружите, что люди охотнее вам помогут, если вы действительно попробовали что-то сами, а не просто хотите, чтобы другие сделали это для вас. Это должно выглядеть примерно так:

1)    BodyPart.objects.all() # all body parts
2)    head = BodyPart.objects.get(body_part='head')
      head_subparts = head.body_subpart.all() # all head subparts

Джанго прекрасно объясняет, как запрашивать эти отношения. https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships Кроме того, в Интернете есть много действительно хороших уроков, касающихся многих отношений djangos.

0 голосов
/ 07 февраля 2012

Вам, вероятно, понадобится комбинация пользовательских полей формы и виджетов, чтобы получить то, что вы хотите.

Проверьте проект django-ajax-Filter-fields , чтобы убедиться, что это близко к тому, что вы ищете. По крайней мере, он даст некоторые рекомендации, если вы решите создать свой собственный.

Вам потребуется некоторый javascript, чтобы сделать новый запрос для динамического заполнения ваших полей, чтобы он также не был доступен со стандартными формами django.

...