Как я могу отфильтровать набор запросов, который я использую в своем поле ModelChoiceField?

#django

#django

Вопрос:

Я просмотрел несколько ответов на SO, но не нашел ни одного, который бы касался моего конкретного случая. У меня есть эта форма модели, которую я использую в панели администратора Django.

 class AssignInventoryForm(ModelForm):
    class Meta:
        model = Driver
        fields = []

    template = forms.ModelChoiceField(queryset=ItemTemplate.objects.all(), 
                                      empty_label="(Select Template)")

    template.label = 'Template'

    def save(self, driver):
        driver = self.form_action(driver)
        return driver
  

Я хотел бы иметь возможность фильтровать ItemTemplate следующим образом:

 ItemTemplate.objects.filter(id=driver.item.id)
  

Но, очевидно, драйвер не определен в этой точке кода.

Ответ №1:

Я нашел хороший ответ отсюда: https://simpleisbetterthancomplex.com/questions/2017/03/22/how-to-dynamically-filter-modelchoices-queryset-in-a-modelform.html

Вот что мне пришлось изменить в моем коде.

В моем классе admin, DriverAdmin, мой метод proccess_action теперь начинается так:

   
   def process_action(self, request, driver_uid, action_form, action_title):
        driver = self.get_object(request, driver_uid)
        if request.method != 'POST':
            # Added drive as parameter to action_form.
            form = action_form(driver)
        else:
            # Added drive as parameter to action_form BEFORE request.POST
            form = action_form(driver, request.POST)
        ... rest of method unchanged ...
  

В моем AssignInventoryForm() классе я добавил этот __init__() метод.

    def __init__(self, driver, *args, **kwargs):
        super(AssignInventoryForm, self).__init__(*args, **kwargs)
        self.fields['template'].queryset = ItemTemplate.objects.filter(id=driver.item.id)