Django - 将参数传递给内联表单集

2024-03-07

我在用inlineformset_factory使用中介考勤模型为客户端和会话之间的多对多关系创建字段。

我的视图文件中有以下内容:

AttendanceFormset = inlineformset_factory(
    Session,
    Attendance,
    formset=BaseAttendanceFormSet,
    exclude=('user'),
    extra=1,
    max_num=10,
    )

session = Session(user=request.user)
formset = AttendanceFormset(request.POST, instance=session)

而且,由于我需要覆盖其中一个表单字段,因此我将以下内容添加到表单集基类中:

class BaseAttendanceFormSet(BaseFormSet):

    def add_fields(self, form, index):
        super(BaseAttendanceFormSet, self).add_fields(form, index)
        form.fields['client'] = forms.ModelChoiceField(
                queryset=Client.objects.filter(user=2))

现在,表单可以正常工作,但我需要将一个值传递到表单集中,以便我可以根据当前用户过滤显示的客户端,而不仅仅是使用 id 2。

有人可以帮忙吗?

任何建议表示赞赏。

Thanks.

EDIT

对于任何阅读的人来说,这对我有用:

def get_field_qs(field, **kwargs):
        if field.name == 'client':
            return forms.ModelChoiceField(queryset=Client.objects.filter(user=request.user))
        return field.formfield(**kwargs)

如何利用 inlineformset_factory 的 formfield_callback 参数而不是提供 formset ?提供一个可调用对象,该可调用对象依次返回应在表单中使用的字段。

表单字段回调获取字段作为第一个参数,**kwargs 获取可选参数(例如:小部件)。

例如(使用 request.user 作为过滤器,如果需要则替换为另一个:

def my_view(request):
    #some setup code here

    def get_field_qs(field, **kwargs):
        formfield = field.formfield(**kwargs)
        if field.name == 'client':
            formfield.queryset = formfield.queryset.filter(user=request.user)
        return formfield

    AttendanceFormset = inlineformset_factory(
        ...
        formfield_callback=get_field_qs
        ...
    )

    formset = AttendanceFormset(request.POST, instance=session)

为了更好地理解它,请参阅用法Django 的 FormSet 代码中的 formfield_callback https://code.djangoproject.com/browser/django/trunk/django/forms/models.py#L163.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 将参数传递给内联表单集 的相关文章

随机推荐