Populate one field in django Admin depending on a previous field value

Viewed 47

I built the following code in my application

models.py

class AnoLetivo(models.Model):

     # regex for name validation
     name_message = 'Formato "aaaa/aaaa". Exemplo: 2020/2021'
     name_regex = RegexValidator(
         regex=r'^\d{4}\/\d{4}$',
         message=name_message,
     )
     name = models.CharField(
         'Designação',
         validators=[name_regex],
         max_length=12,
         unique=False,
         blank=False,
         help_text='Insira um ano letivo com o formato "aaaa/aaaa". Exemplo: 2020/2021'
     )

class Periodo(models.Model):
   
    ano_letivo = models.ForeignKey(
        'AulasPrevistas.AnoLetivo',
        verbose_name='Ano Letivo',
        on_delete=models.CASCADE,
    )
    name = models.CharField(
        'Designação',
        max_length=12,
        unique=False,
        blank=False,
    )

class Feriado(models.Model):
    """ Um modelo para os feriados """

    ano_letivo = models.ForeignKey(
        'AulasPrevistas.AnoLetivo',
        verbose_name='Ano Letivo',
        on_delete=models.CASCADE,
    )
    periodo = models.ForeignKey(
        'AulasPrevistas.Periodo',
        blank=True,
        null=True,
        verbose_name='periodo',
        on_delete=models.CASCADE,
    )
    name = models.CharField(
        'Designação',
        max_length=200,
        unique=False,
        blank=False,
    )

admin.py

class FeriadoForm(forms.ModelForm):

    ano_letivo = forms.CharField(widget=forms.Select(attrs={'onchange': "action_change(this.value);"}))
    

    def __init__(self, *args, **kwargs):
        super(FeriadoForm, self).__init__(*args, **kwargs)
        self.fields['periodo'].queryset = Periodo.objects.filter(
            ano_letivo= ??????? )


class FeriadoAdmin(admin.ModelAdmin):
    """ Criação da Tabela do Feriado no admin """

    form = FeriadoForm

    list_display = [
        'name', 'date', 'tipo', "slug", 'created', 'modified'
    ]
    search_fields = [
        'name', 'date', 'tipo', "slug", 'created', 'modified'
    ]
    list_filter = [
        'name', 'date', 'tipo', "slug", 'created', 'modified'
    ]

    class Media:
        js = ("static/action_change.js",)


admin.site.register(Feriado, FeriadoAdmin)

static/action_change.js

django.jQuery( document ).ready(function() {
    console.log( "ready!" );
    django.jQuery('#id_ano_letivo').change(function() {
      var value = ('#id_ano_letivo').val()
    });
});

The Django Admin dashboard shows the following:

DjangoAdmin

I want to be able to populate Periodo objects depending on Ano Letivo object that was selected.

For example if I select the Ano Letivo: 2022/2023 the Periodo must show A, B, C options (periodo objects related with that Ano Letivo). if I select the Ano Letivo: 2024/2025 the Periodo must show E, F, D options.

I know i must use django.jQuery but i am sutcked in this

anyone can help?

Many Thanks by advance :)

0 Answers
Related