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'

У вас есть какие-нибудь идеи? Спасибо!

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