Как отфильтровать раскрывающуюся форму ForeignKey Django - PullRequest
1 голос
/ 04 февраля 2020

У меня есть форма, которая используется для редактирования (обновления) записи, и поле Author автоматически представляет собой выпадающий список, и это здорово, но как отфильтровать этот список? Например, раскрывающийся список заполняется всем списком пользователей. Как я могу отфильтровать этот список так, чтобы он отображал только те элементы, где isDevice == True?

accounts / models.py

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    isDevice = models.BooleanField(default = False)
    ...

сборок / моделей .py

class BuildQueue(models.Model):
    Author =  models.ForeignKey(CustomUser,blank=True, null= True, on_delete=models.CASCADE)
    ...

forms.py

class BuildQueueEditForm(forms.ModelForm):
    class Meta:
        model = BuildQueue
        fields = ['Author','project', 'customer',]

views.py

class buildQueueEdit(LoginRequiredMixin,UpdateView):
    model = BuildQueue
    form_class = BuildQueueEditForm
    template_name = 'buildQueue_edit.html'

1 Ответ

2 голосов
/ 04 февраля 2020

Поскольку UpdateView унаследовано также от FormMixin, в вашем buildQueueEdit вы можете переопределить get_form , где создается экземпляр формы и где именно вы можете изменить queryset.

поля формы.
class buildQueueEdit(LoginRequiredMixin,UpdateView):
    model = BuildQueue
    form_class = BuildQueueEditForm
    template_name = 'buildQueue_edit.html'

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields['Author'].queryset = CustomUser.objects.filter(isDevice=True)
        return form

ОБНОВЛЕНИЕ

Если вы хотите изменить текст, отображаемый в раскрывающемся списке, вы можете переопределить choises вместо queryset. У меня это сработало.

form.fields['Author'].choices = [(item.id, item.equipmentName) for item in CustomUser.objects.filter(isDevice=True)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...