【问题标题】:Django - Exclude options from ModelChoiceFieldDjango - 从 ModelChoiceField 中排除选项
【发布时间】:2015-05-29 09:32:54
【问题描述】:

我很难尝试使用查询集从 ModelChoiceField 中排除选择。我对 django 和 python 不是很有经验,非常感谢您的帮助。

我正在尝试制作一个表单来将用户分配给一个项目。 我使用内联表单集,我想从表单集中的用户组合框中删除已分配给该项目的用户。

模型表单:

class ProjectUserForm(forms.ModelForm):
    user = forms.ModelChoiceField(queryset=User.objects.all())

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

        if project:
            self.fields['user'].queryset = User.objects.exclude(project=project)

    class Meta:
    model = ProjectUser

观点:

@login_required
def project_update(request, pk):
    if pk is None:
        project = Project()
    else:
        project = Project.objects.get(id=pk)

    ProjectUserFormset = inlineformset_factory(Project, ProjectUser,
        form=ProjectUserForm(project=project),
        extra=0,
        max_num=User.objects.count(),
        fk_name='project',
        can_delete=False,
    )

    if request.method == 'POST':
        project_form = ProjectForm(
            request.POST,
            instance=project
        )
        project_user_formset = ProjectUserFormset(
            request.POST,
            instance=project,
            prefix='project_user'
        )  
        if project_form.is_valid() and project_user_formset.is_valid():
            project = project_form.save(commit=False)
            project_user_formset.save()
            project.save()

    else:
        project_form = ProjectForm(instance=project)
        project_user_formset = ProjectUserFormset(
            instance=project,
            prefix='project_user'
        )

    return render(request, "Nexquality/project_form.html", {
        'title': 'Modify project: '+project.name,
        'form': project_form,
        'project_user_formset': project_user_formset,
    })

【问题讨论】:

    标签: python django web frameworks


    【解决方案1】:

    问题在于表单集工厂没有传递项目实例。它只希望您传递表单类本身,而不是该类的实例。我很惊讶这没有引发错误。

    我处理这个的方式是将实例curry到表单中:

    from django.utils.functional import curry
    
    . . .
    ProjectUserFormset = inlineformset_factory(Project, ProjectUser,
        form=ProjectUserForm,
        extra=0,
        max_num=User.objects.count(),
        fk_name='project',
        can_delete=False,
    )
    ProjectUserFormset.form = staticmethod(curry(ProjectUserForm, project=project))
    

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2013-09-03
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2020-11-20
      • 1970-01-01
      • 2018-07-26
      • 2022-12-09
      相关资源
      最近更新 更多