Я создал модель TransactionModel и связанную с ней ModelForm TransactionForm. Как вы видите ниже, у меня есть поле «Тип», в котором я могу выбрать одно из двух значений: «РАСХОДЫ» и «ДОХОД». Когда я выбираю любой из них, я хочу иметь возможность динамически отключать поле «расходы» или «доходы» в форме, чтобы пользователь не выбирал оба.
Ниже представлена модель
class TransactionModel(models.Model):
type = models.CharField(max_length=100, choices=TransactionType.choices, null=True, default=TransactionType.expense,
verbose_name=_('type'))
title = models.CharField(max_length=200, verbose_name=_('title'))
slug = models.SlugField(max_length=200, unique_for_date='publish')
amount = models.DecimalField(max_digits=8, decimal_places=2, verbose_name=_('amount'))
created = models.DateTimeField(auto_now_add=True, verbose_name=_('created'))
publish = models.DateTimeField(default=timezone.now, verbose_name=_('publish'))
updated = models.DateTimeField(auto_now=True, verbose_name=_('updated'))
expenses = models.CharField(max_length=200, choices=ExpenseType.choices, blank=True, verbose_name=_('expenses'))
incomes = models.CharField(max_length=200, choices=IncomeType.choices, blank=True, verbose_name=_('incomes'))
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='katika_transaction')
Вот форма
class TransactionForm(BSModalForm):
class Meta:
model = TransactionModel
exclude = [
'slug',
'user',
]
def __init__(self, *args, **kwargs):
super(TransactionForm, self).__init__(*args, **kwargs)
if self.fields['type'] == 'EXPENSE':
self.fields['incomes'].disabled = True
self.fields['expenses'].disabled = False
else:
self.fields['expenses'].disabled = True
self.fields['incomes'].disabled = False
Как видите, я попытался поставить условие if в init формы, чтобы это сделать, но это не работает вообще.
в просмотрах не знаю, нужно ли что-то менять, но на всякий случай тоже поделюсь
class CreateTransactionView(BSModalCreateView):
template_name = 'transactions/transaction/add.html'
form_class = TransactionForm
success_message = 'Success: Transaction was added.'
success_url = reverse_lazy('transactions:list')
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)