Django - Ограничить поле выбора набором запросов чужой таблицы? - PullRequest
2 голосов
/ 27 сентября 2011

У меня есть две модели следующим образом:

System_Contact
    first_name
    last_name
    isOwner = CharField ('Y'/'N')
    isMainContact = CharField ('Y'/'N')

System
    mainContact = ForeignKey(System_Contact)
    owner = ForeignKey(System_Contact)
    billTo = ForeignKey(System_Contact)

Итак, когда я показываю форму System на веб-странице, пользователь может выбрать контакты mainContact owner и billToиз выпадающего меню для сохранения в модель System.Однако я хочу отфильтровать поля выбора в форме System, чтобы они выглядели так:

mainContact Select box: -- only show System_Contacts that have isMainContact = 'Y'
owner Select Box: -- only show Syste_Contacts that have isOwner = 'Y'

Как и сейчас, я знаю, как ограничить поле выбора путем фильтрации набора запросов, ноЯ не знаю, как отфильтровать связанный набор запросов внешнего ключа.Поскольку поля mainContact и owner являются внешними ключами, мне нужно отфильтровать внешнюю таблицу (System_Contact), а не таблицу, на которой построена форма (System)

Я знаю, какчтобы отфильтровать обычное поле выбора, не относящегося к типу внешнего ключа, следующим образом:

form.fields["some_field"].queryset = Some_Model.objects.filter(some_field="Foo")

Как бы я «расширил» это, чтобы он отфильтровал внешнюю таблицу?

Это то, что я пытаюсьВ настоящее время безуспешно:

form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y')

Спасибо

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Это то, что я сейчас пытаюсь, но безуспешно:

form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y')

Можете ли вы включить форму и вид вашей модели? Это выглядит нормально для меня.

Другой подход - переопределить метод __init__ формы вашей модели и установить там набор запросов.

class SystemForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(SystemForm, self).__init__(*args, **kwargs)
        self.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y')
    class Meta:
        model = System

Кроме того, я бы рекомендовал использовать BooleanField вместо CharField с вариантами 'Y' и 'N'.

1 голос
/ 28 сентября 2011

Ну, это смущает ...

Когда я вставлял в свой вид и форму модели в соответствии с запросом Alasdair's, я заметил свою ошибку.Вот мой (неправильный) вид:

def system_contacts(request, systemID):
    sys = System.objects.get(pk=systemID)
    if request.method == 'POST':
        form = System_Contacts_Form(request.POST, instance=sys)
        form.fields["systemOwner"].queryset = System_Contact.objects.filter(systemOwner__exact='Y')
        form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact__exact = 'Y')
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/systems/')
    else:
        conts = Contact_List.objects.filter(systemID = sys.pk)
        form = System_Contacts_Form(instance=sys)
    return render_to_response('pages/systems/system_pages/contacts.html', {'sys':sys, 'form':form, 'conts':conts}, context_instance=RequestContext(request))

Я поместил часть form.fields["systemOwner"]... в секцию POST вида, а не секцию GET вида.

Вот мой исправленный вид:

def system_contacts(request, systemID):
    sys = System.objects.get(pk=systemID)
    if request.method == 'POST':
        form = System_Contacts_Form(request.POST, instance=sys)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/systems/')
    else:
        conts = Contact_List.objects.filter(systemID = sys.pk)
        form = System_Contacts_Form(instance=sys)
        form.fields["systemOwner"].queryset = System_Contact.objects.filter(systemOwner__exact='Y')
        form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact__exact = 'Y')
    return render_to_response('pages/systems/system_pages/contacts.html', {'sys':sys, 'form':form, 'conts':conts}, context_instance=RequestContext(request))

Теперь мой исправленный вид работает, и фильтрация работает на входах select в форме.Я бы не подумал посмотреть на это без вашей помощи.

Приветствия: -)

1 голос
/ 28 сентября 2011

Этот синтаксис выглядит правильно.Вы получаете сообщение об ошибке или просто не фильтруете и не показываете всех?Попробуйте System_Contact.objects.get (id = <some valid id>), чтобы увидеть, получает ли он только один или несколько.Если он получает больше, возможно, он заполняется из другого вызова, чем тот, который предполагался.

...