Есть ли в 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. В этом случае вы можете сделать:

  1. Использовать атрибут экземпляра:

    class EntryForm(forms.ModelForm):

     def __init__(self, *args, **kwargs):
         ...  # any staff
         exibitor = self.instance.exibitor
         ...  # any staff
    
  2. Использовать boundedfield.value метод:

    class EntryForm(forms.ModelForm):

     def __init__(self, *args, **kwargs):
         ...  # any staff
         exibitor = self['exibitor'].value()
         ...  # any staff
    
  3. Вы можете получить 'exibitor' раньше и отправить его в form.__init__:

     formentry = EntryForm(.... initial = { ..., 'exibitor': something })
    
  4. Лучший способ - изменить Pen.Queryset в методе formfield_callback в ModelForm Factory. Подробнее здесь: https://docs.djangoproject.com/en/4.1/ref/forms/models/#modelform-factory

    .
Вернуться на верх