#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)