Внешний ключ фильтра Django CreateView в поле выбора - PullRequest
0 голосов
/ 04 июля 2018

Мне нужна помощь с Django 2 и Python 3.

Я использую CreateView для добавления новых записей в мою базу данных, но мне нужно сделать фильтр для моей страницы формы Aviso, чтобы сделать поле выбора (поле turma) показом только тех случаев, когда representante является текущим пользователем.

Это моя модель:

class Turma(models.Model):
    nome                    = models.CharField(max_length=120, blank=False, null=False, help_text='Obrigatório.')
    alunos                  = models.ManyToManyField(User, help_text='Obrigatório', related_name='alunos_matriculados')
    data_cadastro           = models.DateField(auto_now_add=True)
    representante           = models.ForeignKey(User, on_delete=models.PROTECT, blank=False, null=False)
    colegio                 = models.ForeignKey(Colegio, on_delete=models.PROTECT, blank=False, null=False, help_text='Obrigatório.')

class Aviso(models.Model):
    data_final              = models.DateField(auto_now=False, auto_now_add=False, blank=False, null=False, verbose_name="Data Final")
    comentarios             = models.TextField(null=True, blank=True)
    ultima_modificacao      = models.DateField(auto_now=True)
    data_post               = models.DateField(auto_now_add=True)
    turma                   = models.ForeignKey(Turma, on_delete=models.PROTECT, null=False, blank=False)
    materia                 = models.ForeignKey(Materia, on_delete=models.PROTECT, null=False, blank=False)

Это мой взгляд:

class AvisoCreateView(LoginRequiredMixin, CreateView):  #Cadastro de Aviso
    template_name = 'form.html'
    model = models.Aviso
    login_url = '/login/'
    success_url = reverse_lazy('visualizar_aviso')
    fields = [
        'turma',
        'materia',
        'tipo_aviso',
        'comentarios',
        'data_final'
    ]
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        context['titulo'] = 'Cadastrar aviso'
        context['input'] = 'Adicionar'
        return context

Как это могло быть сделано?

1 Ответ

0 голосов
/ 05 июля 2018

Вы можете создать ModelForm для этой модели. И на основе этого ответа вы можете переопределить метод формы __init__(), чтобы изменить поля запроса.

class AvisoForm(forms.ModelForm):
    class Meta:
        model = Aviso
        fields = [
            'data_final', 'comentarios', 'ultima_modificacao', 'data_post',
            'turma', 'materia',
        ]

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super().__init__(*args, **kwargs)

        # restrict the queryset of 'Turma'
        self.fields['turma'].queryset = self.fields['turma'].queryset.filter(
            representante=user)

Затем, по вашему мнению, замените атрибут fields на form_class:

class AvisoCreateView(LoginRequiredMixin, CreateView):
    ...
    form_class = AvisoForm
    ...

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs

Может быть, вам нужно настроить несколько вещей для вашего конкретного случая. Дайте нам знать, если это решило это.

...