Django Form - Выбор зависит от другого поля
Я создаю приложение для управления домашним бюджетом. У меня есть несколько моделей - Дата, Расход, Категория, Доход.
Выглядит это следующим образом
class Date(models.Model):
name = models.CharField(max_length = 15)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='date')
class Category(models.Model):
name = models.CharField(max_length=100)
budget = models.DecimalField(max_digits=8, decimal_places=2)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='category')
date = models.ForeignKey(Date, on_delete=models.CASCADE, related_name='date', default='Styczeń 2022')
class Expense(models.Model):
name = models.CharField(max_length=100)
amount = models.DecimalField(max_digits=8, decimal_places=2)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name="account")
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='expense')
date = models.ForeignKey(Date, on_delete=models.CASCADE, default='Styczeń 2022')
class Income(models.Model):
name = models.CharField(max_length=100)
amount = models.DecimalField(max_digits=8, decimal_places=2)
account = models.ForeignKey(Account, on_delete=models.CASCADE, related_name="account_income")
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='income')
Как сделать выбор категории зависимым от даты в ExpenseForm? Каждая категория имеет свою собственную дату. Мне нужно отобразить категории только для выбранной даты в форме расходов.
Это происходит потому, что пользователь не знает, какую категорию выбрать, если у него есть несколько одинаковых категорий. Например, "Еда" для "Январь 2022", "Февраль 2022" и "Март 2022".
Вот как теперь выглядит моя форма ExpenseForm:
class ExpenseForm(forms.ModelForm):
class Meta:
model = Expense
fields = ('name', 'amount', 'category', 'account', 'date',)
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['category'] = forms.ModelChoiceField(queryset=user.category.all())
self.fields['account'] = forms.ModelChoiceField(queryset=user.account.all())
self.fields['date'] = forms.ModelChoiceField(queryset=user.date.all())
self.fields['name'].widget.attrs.update({'class': 'block w-full px-4 py-3 mb-4 border border-2 border-transparent border-gray-200 focus:outline-none rounded-none !focus:border-red-700'})
self.fields['amount'].widget.attrs.update({'class': 'block w-full px-4 py-3 mb-4 border border-2 border-transparent border-gray-200 focus:outline-none rounded-none !focus:border-red-700'})
self.fields['category'].widget.attrs.update({'class': 'block w-full px-4 py-3 mb-4 border border-2 border-transparent border-gray-200 focus:outline-none rounded-none !focus:border-red-700'})
self.fields['account'].widget.attrs.update({'class': 'block w-full px-4 py-3 mb-4 border border-2 border-transparent border-gray-200 focus:outline-none rounded-none !focus:border-red-700'})
self.fields['date'].widget.attrs.update({'class': 'block w-full px-4 py-3 mb-4 border border-2 border-transparent border-gray-200 focus:outline-none rounded-none !focus:border-red-700'})
self.fields['name'].label = 'Nazwa'
self.fields['amount'].label = 'Kwota'
self.fields['category'].label = 'Kategoria'
self.fields['account'].label = 'Konto bankowe'
self.fields['date'].label = 'Zakres dat'
У вас есть какие-нибудь идеи? Спасибо!