Вызов функции для обновления набора запросов на django -filter Choicefielter - PullRequest
1 голос
/ 05 августа 2020

У меня есть рабочая функция, которая заполняет раскрывающийся список электронными письмами всех зарегистрированных преподавателей. Проблема в том, что когда новый репетитор регистрируется, он перенаправляется на домашний шаблон (где отображается фильтр формы), но раскрывающийся список с вариантами не обновляется, даже если я нажимаю refre sh. Он обновляется после того, как в VisualStudio я останавливаю сервер и снова запускаю runserver или нажимаю ctrl + s, и сервер перезагружается. Я понял, что функция get_tutores () вызывается только один раз, и я хочу, чтобы эта функция вызывалась из представлений каждый раз при перезагрузке страницы.

МОДЕЛЬ

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)

ФИЛЬТР:

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")

ПРОСМОТРЫ

def home(request):
    tutores = Tutor.objects.all()
    filtro_tutor = TutorFilter(request.GET, queryset=tutores)
    tutores = filtro_tutor.qs
    
    context = {
        'tutores':  tutores , 'filtro_tutor': filtro_tutor
    }

    return render(request, 'home.html', context)

ШАБЛОН

<section class="section">
                <div class="container">
                <div class="columns  ">
                    <div class="column  ">
                        <div class="field is-grouped is-small ">
                            <div class="control ">
                                  <form  method="get">
                                    {{  filtro_tutor.form }}
                                    
                                    <div class="control">
                                      <button class="button is-link" type="submit">
                                        Buscar
                                      </button>
                                    </div>
                             </div>
                           </form>
                           
                        </div>
                        <div>
                          {% for obj in filtro_tutor.qs %}
                          {{ obj.correo }} - ${{ obj.user }}<br />
                          {% endfor %}
                        </div>
                        
                    </div>
                  </div>
                </div>
             </section>

Я напечатал в шаблоне набор запросов для l oop, и там он показывает мне новое электронное письмо от нового репетитора, которого я добавил (test9@g.com), но он не отображается в раскрывающемся списке.

Пытался сделать это в домашнем представлении:

filtro_tutor['user'].extra['choices'] = get_tutores()

Но получил "объект TutorFilter 'не может быть подписан"

1 Ответ

1 голос
/ 05 августа 2020

Похоже, что ваш user = ChoiceFilter(…) по сути является ModelMultipleChoiceFilter, но где вы указываете другой field_class, который использует email пользователя, и queryset, который фильтрует пользователей по Tutor :

from django import forms

class <b>UserModelChoiceField</b>(forms.ModelChoiceField):
    
    def <b>label_from_instance</b>(self, obj):
        return str(obj.email)

class <b>UserModelMultipleChoiceFilter</b>(ModelMultipleChoiceFilter):
    field_class = <b>UserModelChoiceField</b>

class TutorFilter(django_filters.FilterSet):
    # &hellip;
    user = <b>UserModelMultipleChoiceFilter</b>(
        queryset=User.objects.<b>filter(tutor__isnull=False)</b>
    )
...