コードの重複を避けるために、インラインからフォームにパラメータを渡したいのですが、エラーが発生しました。issubclass()arg 1はクラスでなければなりません - InlineからFormへパラメータを渡すには?
マイInline
:
class SportUserCriteriasInlineAdmin(GenericTabularInline):
model = CTSportOrPlaceTypesToCriteriasGroups
form = CriteriaChoicesFieldForm('user')
マイAdmin
:
@admin.register(SportTypesGroups)
class SportTypeGroupsAdmin(admin.ModelAdmin):
inlines = [SportUserCriteriasInlineAdmin]
マイForm
:
class CriteriaChoicesFieldForm(forms.ModelForm):
def __init__(self, user_or_team, *args, **kwargs):
super(CriteriaChoicesFieldForm, self).__init__(*args, **kwargs)
if user_or_team == 'user':
# DO SOMETHING
class Meta:
model = CTSportOrPlaceTypesToCriteriasGroups
fields = '__all__'
ラインinlines = [SportUserCriteriasInlineAdmin]
がエラーを生成します。
File "/home/sweetuser/www/sportproject/lib/python3.5/site-packages/django/contrib/admin/checks.py", line 255, in _check_form
if hasattr(obj, 'form') and not issubclass(obj.form, BaseModelForm):
TypeError: issubclass() arg 1 must be a class
したがって、パラメータは実際に渡されます(私はprint()
で確認しました)が、何らかの理由でadmin
部分に問題があります。
あなたのインラインクラスの3行目にフォームをインスタンス化しています。その段階で、管理者はフォームオブジェクトではなくフォームクラスを要求します。 https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#adding-custom-validation-to-the-adminを参照してください。 'checks.py'でチェックされていると思われます。 – nimasmi
' CriteriaChoicesfieldForm'を 'UserCriteriaChoicesfieldForm'と' TeamCriteriaChoicesfieldForm'にサブクラス化し、 '__init__'だけが違うようにDRYすることもできます。 – nimasmi