Как я могу получить доступ к экземпляру объекта на форме django?
У меня есть вопрос, связанный с Django, на который я не могу найти правильный ответ:
Данная форма получает данные полей из набора запросов в другую модель:
class EditTripForm(ModelForm):
start_date = forms.DateField(label='Desde', widget=MyDateInput(attrs={'class': 'form-control'}))
end_date = forms.DateField(label='Hasta', widget=MyDateInput(attrs={'class': 'form-control'}))
operations = forms.ModelMultipleChoiceField(
widget = forms.CheckboxSelectMultiple,
queryset = OperationCard.objects.order_by('-date').all()
)
class Meta:
model = Trip
fields = ['start_date', 'end_date', 'operations']
Я хотел бы отфильтровать набор запросов так, чтобы я мог использовать собственную дату начала_даты или дату конца_даты формы для создания запроса, подобного этому:
class EditTripForm(ModelForm):
start_date = forms.DateField(label='Desde', widget=MyDateInput(attrs={'class': 'form-control'}))
end_date = forms.DateField(label='Hasta', widget=MyDateInput(attrs={'class': 'form-control'}))
operations = forms.ModelMultipleChoiceField(
widget = forms.CheckboxSelectMultiple,
queryset = OperationCard.objects.order_by('-date').filter(date__gte=start_date)
)
class Meta:
model = Trip
fields = ['start_date', 'end_date', 'operations']
Обратите внимание на часть .filter(date_gte=start_date)
Возможно ли это вообще? Как я должен к этому подойти?
По умолчанию в django это невозможно. Пользователь не будет заполнять поле end_date до тех пор, пока форма не будет сгенерирована django и отправлена в браузер, поэтому django не будет знать значение end_date, когда будет создавать возможные значения для операций.
Вообще говоря, вам нужно использовать javascript для манипуляции возможными значениями поля на самой странице, или разделить форму на две, чтобы вы могли отправить значения из первой формы и использовать их для создания возможных значений второй.
Зависит от того, что вам нужно. Если вам нужно фильтровать queryset в зависимости от ввода пользователя, @SamSparx уже ответил вам.
Если вам нужно фильтровать queryset на основе начальных данных формы из экземпляра Trip, то вы можете переопределить конструктор формы и использовать что-то вроде этого:
class EditTripForm(ModelForm):
start_date = forms.DateField(label='Desde', widget=MyDateInput(attrs={'class': 'form-control'}))
end_date = forms.DateField(label='Hasta', widget=MyDateInput(attrs={'class': 'form-control'}))
operations = forms.ModelMultipleChoiceField(
widget = forms.CheckboxSelectMultiple,
# no query here
queryset = OperationCard.objects.none()
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
trip = self.instance
# filter by date here
self.fields['operations'].queryset = OperationCard\
.order_by('-date')\
.filter(date__gte=trip.start_date)
class Meta:
model = Trip
fields = ['start_date', 'end_date', 'operations']