Способы изменения раскрывающегося списка в django -фильтре - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь изменить значения раскрывающегося списка для пользовательского поля. Я хочу показать адреса электронной почты вместо nombre + apellido. Поскольку в моих моделях у меня есть str, которая возвращает nombre + apellido, это значения, отображаемые в раскрывающемся списке. Как я могу изменить эти значения, не меняя str в модели Tutor? Пытался сделать CustomManager, но не сработало.

МОДЕЛЬ:


class Tutor(models.Model):

    user = models.OneToOneField(
        User, on_delete=models.CASCADE, primary_key=True)
    nombre = models.CharField(max_length=50, blank=False, null=True)
    apellido = models.CharField(max_length=50, blank=False, null=True)
    biografia = models.TextField()
    curriculum = models.FileField(upload_to="curriculums/", blank=True, null=True)
    foto = models.ImageField(blank=True, null=True)
    carrera = models.ManyToManyField(Carrera, blank=True)
    linea_invest = models.ManyToManyField(Linea_Invest, blank=True)
    correo = models.EmailField(blank=True, null=True)
    numero_celular = models.CharField(max_length=20, blank=True, null=True)
    
    class Meta:
        verbose_name_plural = "Tutores"
        verbose_name = "Tutor"

    def __str__(self):
        return '%s %s' % (self.nombre, self.apellido)

ФИЛЬТР

class TutorFilter(django_filters.FilterSet):

    nombre = CharFilter(field_name="nombre", label="Nombre",lookup_expr='icontains')
    apellido = CharFilter(field_name="apellido", label="Apellido",lookup_expr='icontains')
    carrera = ModelMultipleChoiceFilter(field_name= "carrera", queryset= Carrera.objects.all())
    user = ModelChoiceFilter(field_name = "user", label = "correo", queryset = Tutor.objects.all())
    class Meta:
        model = Tutor
        fields = ("nombre", "apellido", "carrera","user")

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Как я решил:

def get_tutores():
    tutores = []
    for tut in Tutor.objects.all():
        tutores.append((tut.user.id,tut.user.email,))
    return tutores


class TutorFilter(django_filters.FilterSet):
    nombre = CharFilter(field_name="nombre", label="Nombre",lookup_expr='icontains')
    apellido = CharFilter(field_name="apellido", label="Apellido",lookup_expr='icontains')
    carrera = ModelMultipleChoiceFilter(field_name= "carrera", queryset= Carrera.objects.all())
    user = ChoiceFilter( label = "correo", choices=get_tutores())
    
    class Meta:
        model = Tutor
        fields = ("nombre", "apellido", "carrera","user")


Посмотрите, как мне не нужно было изменять метод str в модели Tutor, чтобы отображать в раскрывающемся списке электронные письма преподавателя в качестве вариантов выбора, потому что вместо использования ModelChoiceFilter я изменил в ChoiceFilter. Не знал, что вы можете вызвать функцию в аргументе choices в ChoiceFilter.

0 голосов
/ 04 августа 2020

В вашем TutorFilter. Изменить

 user = ModelChoiceFilter(field_name = "user", label = "correo", queryset = user.objects.all())
...