[英]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.