Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django CreateView筛选选择字段中的外键_Django_Django Views - Fatal编程技术网

Django CreateView筛选选择字段中的外键

Django CreateView筛选选择字段中的外键,django,django-views,Django,Django Views,我需要一些关于Django 2和Python 3的帮助 我正在使用CreateView在我的数据库中添加新记录,但我需要为我的Aviso表单页面制作一个过滤器,使选择字段(fieldturma)仅显示representante是当前用户的实例 这是我的模型: class Turma(models.Model): nome = models.CharField(max_length=120, blank=False, null=False, help_

我需要一些关于Django 2和Python 3的帮助

我正在使用
CreateView
在我的数据库中添加新记录,但我需要为我的
Aviso
表单页面制作一个过滤器,使选择字段(field
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
如何做到这一点?

您可以为该模型创建一个。 基于此,您可以重写forms
\uuuu init\uuu()
方法来更改字段queryset

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)
然后,在您看来,将属性
字段
替换为
表单类

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

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs
也许你需要根据你的具体情况调整一些事情。 让我们知道这是否解决了问题。

您可以为该模型创建一个。 基于此,您可以重写forms
\uuuu init\uuu()
方法来更改字段queryset

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)
然后,在您看来,将属性
字段
替换为
表单类

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

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['user'] = self.request.user
        return kwargs
也许你需要根据你的具体情况调整一些事情。
让我们知道这是否解决了问题。

您可以在ForeignKey字段中添加查询集

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['form'].fields['turma'].queryset = Turma.objects.filter(representante=self.request.user)    
    context['titulo'] = 'Cadastrar aviso'
    context['input'] = 'Adicionar'
    return context

您可以向ForeignKey字段添加查询集

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['form'].fields['turma'].queryset = Turma.objects.filter(representante=self.request.user)    
    context['titulo'] = 'Cadastrar aviso'
    context['input'] = 'Adicionar'
    return context

我得到了一个错误:“AvisoForm”对象没有属性“request”。@RafaelZottesso啊,对了,我编辑了我的答案以包含方法
AvisoCreateView.get_form_kwargs()
,我还为
AvisoForm添加了一行。我做了类似的事情并成功了。感谢您的时间和回复。我遇到一个错误:“AvisoForm”对象没有属性“request”。@RafaelZottesso啊,对了,我编辑了我的答案,将方法
AvisoCreateView.get_form_kwargs()
包括在内,我还为
AvisoForm添加了一行内容。\uu init_u()
。我做了类似的事情并成功了。感谢您的时间和回复。