2016-10-12 5 views
0

コードの重複を避けるために、インラインからフォームにパラメータを渡したいのですが、エラーが発生しました。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部分に問題があります。

+0

あなたのインラインクラスの3行目にフォームをインスタンス化しています。その段階で、管理者はフォームオブジェクトではなくフォームクラスを要求します。 https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#adding-custom-validation-to-the-adminを参照してください。 'checks.py'でチェックされていると思われます。 – nimasmi

+0

' CriteriaChoicesfieldForm'を 'UserCriteriaChoicesfieldForm'と' TeamCriteriaChoicesfieldForm'にサブクラス化し、 '__init__'だけが違うようにDRYすることもできます。 – nimasmi

答えて

0

私はここであなたのコードの残りの部分を推測していますが、これはどうですか?

admin.py:

class SportUserCriteriasInlineAdmin(GenericTabularInline): 
    model = CTSportOrPlaceTypesToCriteriasGroups 
    form = UserCriteriaChoicesFieldForm 


class SportTeamCriteriasInlineAdmin(GenericTabularInline): 
    model = CTSportOrPlaceTypesToCriteriasGroups 
    form = TeamCriteriaChoicesFieldForm 


@admin.register(SportTypesGroups) 
class SportTypeGroupsAdmin(admin.ModelAdmin): 
    inlines = [SportUserCriteriasInlineAdmin] 

形式:

class CriteriaChoicesFieldForm(forms.ModelForm): 

    class Meta: 
     model = CTSportOrPlaceTypesToCriteriasGroups 
     fields = '__all__' 


class UserCriteriaChoicesFieldForm(CriteriaChoicesFieldForm): 
    def __init__(self, user_or_team, *args, **kwargs): 
     super(UserCriteriaChoicesFieldForm, self).__init__(*args, **kwargs) 
     # DO SOMETHING 
+0

\ inlineから 'form'に' 'user''をどのように渡しますか? – TitanFighter

+0

私は、 'SportTeamCriteriasInlineAdmin'ではなく' SportUserCriteriasInlineAdmin'を選択することで、同じことを効果的に達成することを意図していました。前者は 'UserCriteriaChoicesFieldForm'と後者' TeamCriteriaChoicesFieldForm'を使います。そのフォームの 'User ...'変種は、以前の 'user_or_team'引数を渡すことによって達成された、' __init__'における余分な処理を行います。このソリューションは、2つのフォーム・バリアントでかなりDRYですが、それよりも多様な場合は、工場について考え始める必要があります。 – nimasmi

関連する問題