Django-smart-selects non funziona nel FilterSet

di il
0 risposte

Django-smart-selects non funziona nel FilterSet

Salve a tutti.

Premetto che sono veramente alle prime armi in questo campo. Però per ora non son riuscito a trovare nemmeno una soluzione.

In pratica ho tre modelli Django:

  • Societa;
  • Impianto;
  • Intervento.

Una Societa può avere molti impianti, mentre un Impianto ha solo una società (Relazione uno a molti). Il modello “Intervento” è collegato ai due precedenti, perché in pratica esso contiene gli interventi che sono stati effettuati ai vari impianti delle rispettive società.

Ho creato i form relativi a questi tre modelli ed ho utilizzato il form “InterventoForm”, per creare il template d'inserimento degli interventi ("addIntervento.html").

Il template “addIntervento.html” contiene due combobox, che dipendono dal modello “Societa” e dal modello “Impianto”.

In questo template Django-smart-selects funziona perfettamente, poiché la combox “Societa” filtra la combobox “Impianto”.

Poi ho aggiunto il template “Riepilogo.html”. Esso contiene una tabella nella quale sono registrati tutti gli interventi effettuati. La tabella in questione viene filtrata grazie al FilterSet di Django.


Il mio problema nasce quando provo ad implementare Django-smart-selects, nel FilterSet inserito all'interno del template "Riepilogo.html".

Infatti in questo caso la combobox “Societa”, non filtra la combobox “Interventi”. 

Ho cercato su internet e nella documentazione di Django, ma per ora non sono ancora riuscito a trovare risposta.

Ecco i codici utilizzati:

models.py

class Societa(models.Model):
    ID = models.AutoField(primary_key=True, unique=True)
    societa_nome = models.CharField(max_length=100)
    numero_telefono = models.CharField(max_length=100, blank=True)
    email = models.EmailField(max_length=100, blank=True)

class Impianto(models.Model):
    ID = models.AutoField(primary_key=True)
    impianto_nome = models.CharField(max_length=100)
    ID_societa = models.ForeignKey(Company, on_delete=models.CASCADE)

class Intervento(models.Model):
    ID = models.AutoField(primary_key=True)
    data_inizio = models.DateField()
    descrizione = models.TextField()
    ID_societa = models.ForeignKey(Company, on_delete=models.CASCADE)
    ID_impianto = ChainedForeignKey( 	#Django-smart-selects
        Impianto,
        chained_field="ID_societa",
        chained_model_field="ID_societa",
        show_all=False,
        auto_choose=True,
        sort=True)

filters.py

import django_filters
from django_filters import DateFilter, CharFilter
from django.forms import DateInput

from .models import Intervento

class InterventoFilter(django_filters.FilterSet):
    data1 = DateFilter(field_name='start_date', lookup_expr='gte', label='Da', widget=DateInput(attrs={'type': 'date'})) #GTE
    data2 = DateFilter(field_name='start_date', lookup_expr='lte', label='A', widget=DateInput(attrs={'type': 'date'})) #LTE
    descr = CharFilter(field_name='description', lookup_expr='icontains', label='Descrizione')
    class Meta:
        model = Intervento
        exclude = ['data_inizio', 'descrizione'] #(data1, data2, descr)
        fields = ['data1',
                  'data2',
                  'ID_societa',
                  'ID_impianto', 
                  'descr']

riepilogo.html

{% extends 'base.html'%}
{% load crispy_forms_tags %}
{% block content %}
<form method="post" action="{% url 'riepilogo' %}">
    {% csrf_token %}
    <div class="d-print-none">
            <div class="container border border-dark rounded p-3">
                    <div class="row">
                        <div class="col-md-6 col-6">{{ filtri.form.data1|as_crispy_field }}</div>
                        <div class="col-md-6 col-6">{{ filtri.form.data2|as_crispy_field }}</div>
                    </div>
                    
                    <div class="row">
                        <div class="col-md-12 col-12">{{ filtri.form.ID_societa|as_crispy_field }}</div>
                    </div>

                    <div class="row">
                        <div class="col-md-12 col-12">{{ filtri.form.ID_impianto|as_crispy_field }}</div>
                    </div>
                    
                    <div class="row">
                        <div class="col-md-12 col-12">{{ filtri.form.descr|as_crispy_field }}</div>
                    </div>
                    
                    <br>
                    
                    <div class="form-row">
                        <div class="col-auto text-center"><button type="submit" class="btn btn-primary">Search</button></div>
                    </div>
                </div>
    </div>
</form>
{% endblock %}

views.py 

from django.shortcuts import render
from django.contrib.auth.decorators import login_required
from .filters import InterventoFilter

@login_required
def riepilogo(request):
    tabella = Intervento.objects.all().values('ID',
                                              'data_inizio',
                                              'ID_impianto__impianto_nome',
                                              'descrizione').order_by('data_inizio')

    filtri = InterventoFilter(request.POST, queryset=tabella)
    tabellaFiltrata = filtri.qs

    return render(request, 'riepilogo.html', {'filtri': filtri,
                                              'tabellaFiltrata': tabellaFiltrata})

Per quale motivo non funziona Django-smart-selects nel FilterSet?

Perché invece nel template “addIntervento.html” basato su un Django-Form. Django-smart-selects funziona?

Un grande grazie a tutti quanti.

Buona programmazione.

Devi accedere o registrarti per scrivere nel forum
0 risposte