Есть ли в django способ получить доступ к значению выбранного поля ForeignKey в ModelForm для фильтрации другого ForeignKey в форме?
В django 4.1.3
Попытка отфильтровать запрос поля ForeignKey, используя значение другого выбранного поля ForeignKey в ModelForm, чтобы ограничить фильтр в зависимости от соответствующего идентификатора выбранного экспонента.
from django import forms
from .models import Entry, Exhibitor, Pen
class EntryForm(forms.ModelForm):
class Meta:
fields = ('exhibitor', 'pen', 'class_id',)
def __init__(self, *args, **kwargs):
super(EntryForm, self).__init__(*args, **kwargs)
# Can't figure out how to filter
# Using the selected exhibitor field value
self.fields['pen'].queryset = Pen.objects.filter(current_owner_id=1)
# where 1 should be the exhibitor_id
# using an int value for the current_owner_id works to filter the query
# but don't know how to access selected field values, or would this work in a pre_save function?
# tried
self.fields['pen'].queryset = Pen.objects.filter(current_owner_id=
self.fields['pen']
)
TypeError at /admin/exhibitors/entry/add/ Поле 'id' ожидало число, но получило объект <django.forms.models.ModelChoiceField at 0x2b630a6b2100>.
У вас есть ModelForm. Это значит, что ваша форма всегда имеет экземпляр Entry. В этом случае вы можете сделать:
Использовать атрибут экземпляра:
class EntryForm(forms.ModelForm):
def __init__(self, *args, **kwargs): ... # any staff exibitor = self.instance.exibitor ... # any staff
Использовать
boundedfield.value
метод:class EntryForm(forms.ModelForm):
def __init__(self, *args, **kwargs): ... # any staff exibitor = self['exibitor'].value() ... # any staff
Вы можете получить 'exibitor' раньше и отправить его в
form.__init__
:formentry = EntryForm(.... initial = { ..., 'exibitor': something })
Лучший способ - изменить Pen.Queryset в методе formfield_callback в ModelForm Factory. Подробнее здесь: https://docs.djangoproject.com/en/4.1/ref/forms/models/#modelform-factory
.