簡體   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