繁体   English   中英

Django - 将参数传递给内联formset

[英]Django - Passing parameters to inline formset

我使用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)

并且,因为我需要覆盖其中一个表单字段,我将以下内容添加到formset基类:

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))

现在,表单正常工作,但我需要将值传递给formset,以便我可以过滤基于当前用户显示的客户端,而不是仅使用id 2。

有人可以帮忙吗?

任何建议表示赞赏

谢谢。

编辑

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

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的用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM