Django.fun

How to display conditional form field that is dependent on an attribute of a selected foreign key on django model form

I want to conditionally display either frequency_input or duration_input fields based on the behavior.recording attribute of the selected behavior.

I have a Trial form that currently displays 3 fields:

  • behavior_name (foreign Key) dropdown
  • frequency_input
  • duration_input

Im not sure if i should the best method to solve this (Javascript or solve in the View)?

Trial Model

class Trial(models.Model):
    behavior_name = models.ForeignKey(Behavior, on_delete=models.CASCADE)
    client_session = models.ForeignKey(Client_Session, on_delete=models.CASCADE)
    frequency_input = models.PositiveIntegerField(default=0, blank=True)
    duration_input = models.DurationField(blank=True, default=timedelta(minutes=0))


    class Meta:
        verbose_name_plural = 'trials'

    def __str__(self):
        return str(self.id)

Behavior Model

RECORDING_CHOICES = (
    ('Rate','RATE'),
    ('Duration','DURATION'),
    ('Frequency','FREQUENCY')
)

class Behavior(models.Model):
    name = models.CharField(max_length=200)
    goal = models.CharField(max_length=200)
    recording = models.CharField(max_length=10, choices=RECORDING_CHOICES, null=False)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='Active')
    
    def __str__(self):
        return self.name

Trial Form

class TrialForm(forms.ModelForm):
    class Meta:
        model = Trial
        fields = ('behavior_name','frequency_input', 'duration_input')

Add Trial View

def add_trial(request, clientsession_id):
    client_session = Client_Session.objects.get(id=clientsession_id)
    if request.method != 'POST':
        form = TrialForm()
    else:
        form = TrialForm(data=request.POST)
        if form.is_valid():
            add_trial = form.save(commit=False)
            add_trial.client_session = client_session
            add_trial.save()
            return HttpResponse(status=204, headers={'HX-Trigger': 'trialupdated'})

    context = {'client_session': client_session, 'form': form}
    return render(request, 'sessions/add_trial.html', context)

Tutorials

Константы Python: Улучшение управляемости вашего кода

Современный Python: начинаем проект с pyenv и poetry

Настройка проекта Python — виртуальные среды и управление пакетами

Использование requests в Python — тайм-ауты, повторы, хуки

Понимание декораторов в Python

ProcessPoolExecutor в Python: полное руководство

map() против submit() с ProcessPoolExecutor в Python

Понимание атрибутов, словарей и слотов в Python

Полное руководство по slice в Python

Выпуск Django 4.0

Безопасное развертывание приложения Django с помощью Gunicorn, Nginx и HTTPS

Автоматический повтор невыполненных задач Celery

Django REST Framework и Elasticsearch

Докеризация Django с помощью Postgres, Gunicorn и Nginx

Асинхронные задачи с Django и Celery

Релизы безопасности Django: 3.2.4, 3.1.12 и 2.2.24

Выпуски исправлений ошибок Django: 3.2.3, 3.1.11 и 2.2.23

Эффективное использование сериализаторов Django REST Framework

Выпуски безопасности Django: 3.2.2, 3.1.10 и 2.2.22

Выпущенные релизы безопасности Django: 3.2.1, 3.1.9 и 2.2.21

View all tutorials →