Django CreateView筛选选择字段中的外键
我需要一些关于Django 2和Python 3的帮助 我正在使用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_
CreateView
在我的数据库中添加新记录,但我需要为我的Aviso
表单页面制作一个过滤器,使选择字段(fieldturma
)仅显示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()
。我做了类似的事情并成功了。感谢您的时间和回复。