首页 > 解决方案 > 如何从查询集中填充表单的初始值

问题描述

我有FormView一个get_initial方法,我试图用它来填充表单。我试图在表单中获取as 值的EmployeeTypes 。receivermemo

    def get_initial(self):
        initial = super(NotificationView, self).get_initial()
        users = Memo.objects.filter(id=self.kwargs['pk']).values('receiver__employee_type')
        initial['receiving_groups'] = users
        return initial

这里有2个问题..

  1. 这将返回一个查询集,如下所示:<QuerySet [{'receiver__employee_type': 'Bartender'}, {'receiver__employee_type': 'Supervisor'}]>当我真的需要表单中的字段EmployeeType本身时。
  2. 最重要的是 - 表单甚至没有呈现这些字段。

这是以防万一的形式:

class MemoNotificationForm(forms.Form):
    class Meta:
        fields = [
            'receiving_groups'
        ]
    receiving_groups = forms.MultipleChoiceField(
        required=False,
        widget=forms.CheckboxSelectMultiple)

如何填充表单的字段?

编辑:

class Memo(models.Model):
    receiver = models.ManyToManyField(EmployeeType, related_name='memos_receiver')

class EmployeeType(models.Model):
    """Stores user employee type."""
    employee_type = models.CharField(
        max_length=32,
        unique=True)

标签: djangopython-3.x

解决方案


a Metaon aforms.Form不做任何事情,这用于ModelForms

如果receiving_groups应该是选择,EmployeeType那么它应该是ModelMultipleChoiceField

class MemoNotificationForm(forms.Form):
    receiving_groups = forms.ModelMultipleChoiceField(
        EmployeeType.objects.all(),
        widget=forms.CheckboxSelectMultiple
    )

然后你应该在初始时传递实例或模型的查询集

    def get_initial(self):
        initial = super(NotificationView, self).get_initial()
        initial['receiving_groups'] = EmployeeType.objects.filter(memo__id=self.kwargs['pk'])
        return initial

编辑:因为ModelForm这可能看起来像这样

class MemoNotificationForm(forms.ModelForm):

    class Meta:
        model = Memo
        fields = ('receiver', )

看法:

class NotificationView(FormView);
    form_class = MemoNotificationForm

    def get_form_kwargs(self):
        kwargs = super(NotificationView, self).get_form_kwargs()
        kwargs['instance'] = get_object_or_404(Memo, id=self.kwargs['pk'])
        return kwargs

推荐阅读