我花了很多時間相當試圖拿出我能重新的解決方案跨站點使用。詹姆斯的帖子包含了延伸BaseInlineFormSet
但策略性地調用BaseFormSet
的呼叫的關鍵部分。
下面的解決方案分爲兩部分:一個AdminInline
和一個BaseInlineFormSet
。
InlineAdmin
根據暴露的請求對象動態生成一個初始值。
- 它使用currying通過傳遞給構造函數的關鍵字參數將初始值公開到自定義
BaseInlineFormSet
。
- 構造函數
BaseInlineFormSet
將關鍵字參數和構造的列表中的初始值從通常情況下彈出。
- 最後一塊是通過改變形式的最大總數,並使用
BaseFormSet._construct_form
和BaseFormSet._construct_forms
方法
下面是使用OP的類中的某些具體的片段覆蓋表單施工過程。我已經對Django 1.2.3進行了測試。我強烈建議在開發時保留formset和admin文檔。
admin.py
from django.utils.functional import curry
from django.contrib import admin
from example_app.forms import *
from example_app.models import *
class AttendanceInline(admin.TabularInline):
model = Attendance
formset = AttendanceFormSet
extra = 5
def get_formset(self, request, obj=None, **kwargs):
"""
Pre-populating formset using GET params
"""
initial = []
if request.method == "GET":
#
# Populate initial based on request
#
initial.append({
'foo': 'bar',
})
formset = super(AttendanceInline, self).get_formset(request, obj, **kwargs)
formset.__init__ = curry(formset.__init__, initial=initial)
return formset
forms.py
from django.forms import formsets
from django.forms.models import BaseInlineFormSet
class BaseAttendanceFormSet(BaseInlineFormSet):
def __init__(self, *args, **kwargs):
"""
Grabs the curried initial values and stores them into a 'private'
variable. Note: the use of self.__initial is important, using
self.initial or self._initial will be erased by a parent class
"""
self.__initial = kwargs.pop('initial', [])
super(BaseAttendanceFormSet, self).__init__(*args, **kwargs)
def total_form_count(self):
return len(self.__initial) + self.extra
def _construct_forms(self):
return formsets.BaseFormSet._construct_forms(self)
def _construct_form(self, i, **kwargs):
if self.__initial:
try:
kwargs['initial'] = self.__initial[i]
except IndexError:
pass
return formsets.BaseFormSet._construct_form(self, i, **kwargs)
AttendanceFormSet = formsets.formset_factory(AttendanceForm, formset=BaseAttendanceFormSet)
這個問題已經有幾年了。現在在Django 1.3中有更簡單的解決方案嗎? – monkut 2011-08-25 13:43:05
是的,它解決了。只需在參數中傳遞相關實例,並將其預填充它。 – 2012-01-04 19:21:54
有誰知道如何實現上面提到的「只需在參數中傳遞相關實例,並且它會預填充它」的任何地方的參考? – i3enhamin 2012-02-16 00:01:09