Hello
I’m using the django-filter extension to filter the records of my queryset. So far, I have only used fields from a single model. But I would also like to be able to filter data that is connected to this model via an FK. How do I do that?
It’s about these two models.
class Responsibility(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE, verbose_name='Projekt')
system = models.ForeignKey(System, on_delete=models.CASCADE, verbose_name='Baugruppe')
team = models.ForeignKey(Team, on_delete=models.CASCADE, verbose_name='Team')
employee = models.ForeignKey(Employee, on_delete=models.SET_NULL, blank=True, null=True, verbose_name='Mitarbeiter')
created_at = models.DateTimeField(auto_now_add=True, editable=False, blank=True, verbose_name='Erstelldatum')
updated_at = models.DateTimeField(auto_now=True, editable=False, blank=True, verbose_name='Änderungsdatum')
class Meta:
verbose_name = 'Verantwortlichkeit'
verbose_name_plural = 'Verantwortlichkeiten'
constraints = [
models.UniqueConstraint(fields=['project', 'system', 'team', 'employee'], name='uq_project_system_team_employee')
]
def __str__(self):
return f'{self.project} | {self.system} | {self.team} | {self.employee}'
class Status(models.Model):
COLORS = (
('Rot', 'Rot'),
('Gelb', 'Gelb'),
('Grün', 'Grün'),
)
responsibility = models.OneToOneField(Responsibility, on_delete=models.CASCADE, unique=True, verbose_name='Verantwortlichkeit')
traffic_light = models.CharField(max_length=4, choices=COLORS, default='Grün', verbose_name='Ampel')
created_at = models.DateTimeField(auto_now_add=True, editable=False, blank=True, verbose_name='Erstelldatum')
updated_at = models.DateTimeField(auto_now=True, editable=False, blank=True, verbose_name='Änderungsdatum')
class Meta:
verbose_name = 'Status'
verbose_name_plural = 'Status'
def __str__(self):
return f'{self.responsibility} | {self.traffic_light}'
filters.py
import django_filters
from .models import Responsibility
class ResponsibilityFilter(django_filters.FilterSet):
class Meta:
model = Responsibility
fields = ['project', 'system', 'team', 'employee']
I also want to be able to filter by the traffic_light from the status model.
My second question: how can I filter multiple values? At the moment, I can only filter a single record. Here I use the filter in the template.
<div class="card-body bg-light">
<form method="GET">
<div class="row">
{% for field in responsibilities_filter.form %}
<div class="col fw-bold">
{{ field.label_tag }}
{% render_field field class="form-control form-control" %}
</div>
{% endfor %}
<div class="col align-self-end">
<button class="btn btn-primary text-white" type="submit">Filtern <i class="fa fa-filter"></i></button>
<a href="{% url 'responsibilities' %}" class="btn btn-danger">Zurücksetzen <i class="fa fa-times-circle"></i></a>
</div>
</div>
</form>
</div>
views.py
from django.shortcuts import render, get_object_or_404
from .models import Responsibility, BottleneckPart, Drawing, Meeting, Phase, Input, Output
from .filters import ResponsibilityFilter
# Create your views here.
def responsibilities_overview(request):
responsibilities = Responsibility.objects.all()
responsibilities_filter = ResponsibilityFilter(request.GET, queryset=responsibilities)
responsibilities = responsibilities_filter.qs
context = {'responsibilities': responsibilities, 'responsibilities_filter': responsibilities_filter}
return render(request, 'systemcockpit/responsibilities_overview.html', context)
Best regards
Patrick