Включить и отключить динамически одно поле при условии наличия другого в Django - PullRequest
0 голосов
/ 06 мая 2020

Я создал модель 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)
...