13 Stimmen

Verwendung von 'django-filter' mit CHOICES-Feld - benötigt "Any"-Option

Ich verwende den sehr coolen django-Filter (via: http://github.com/alex/django-filter ) und komme entweder mit den Unterlagen nicht zurecht oder brauche einfach eine kleine Unterstützung brauchen.

Wenn ich das Filterformular auf einer Objektlistenseite einblende, erhalte ich für ein FK-Feld die Dropdown-Liste, die ein "-----" enthält, was zu einem Filter vom Typ "beliebig" ergibt. Aber ich habe einige Auswahlmöglichkeiten für ein Feld in diesem Modell festgelegt, und ich möchte die gleiche Option vom Typ "any" erhalten. Hier ist ein relevanter Beispielabschnitt aus models.py:

TICKET_STATUS_CHOICES = (
    ('new', 'New'),
    ('accepted', 'Accepted'),
    ('assigned', 'Assigned'),
    ('reopened', 'Reopened'),
    ('closed', 'Closed'),
)

class Ticket(models.Model):
    assigned_to = models.ForeignKey(User, null=True, blank=True)
    status = models.CharField(max_length=20,
choices=TICKET_STATUS_CHOICES, default='new')

import django_filters

class TicketFilter(django_filters.FilterSet):
    class Meta:
        model = Ticket
        fields = ['assigned_to', 'status']

Wenn ich das Filterformular anzeige, wird ' assigned_to' erhält eine 'any'-Option, da sowie eine Auflistung der verfügbaren Benutzer. Die 'status' Feld ist jedoch auf die im Feld "_CHOICES" aufgeführten Optionen beschränkt.

Wie füge ich den Feldern, die auf _CHOICES basieren, eine Option "any" hinzu?

1voto

Visgean Skeloru Punkte 2179

Ich habe alle oben genannten Methoden kombiniert, da ich nicht alle Felder, die aktualisiert werden müssen, angeben wollte, und bin zu folgendem Ergebnis gekommen:

import django_filters

from django.db import models
from django_filters.filters import ChoiceFilter

EMPTY_CHOICE = ('', '---------')

class TicketFilter(django_filters.FilterSet):
    def __init__(self, *args, **kwargs):
        super(TicketFilter, self).__init__(*args, **kwargs)
        # add empty choice to all choice fields:
        choices = filter(
            lambda f: isinstance(self.filters[f], ChoiceFilter),
            self.filters)

        for field_name in choices:
            extended_choices = ((EMPTY_CHOICE,) +
                                self.filters[field_name].extra['choices'])
            self.filters[field_name].extra['choices'] = extended_choices

Das erfüllt den Zweck.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X