姜戈在选择字段中创建过滤外键 [英] Django CreateView filter foreign key in select field

查看:36
本文介绍了姜戈在选择字段中创建过滤外键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要一些有关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

如何做到这一点?

推荐答案

您可以为该模型创建ModelForm。 基于this answer,您可以重写表单__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

也许您需要针对您的特定情况调整一些内容。 如果解决了问题,请让我们知道。

这篇关于姜戈在选择字段中创建过滤外键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆