10

インラインフォームセットを作成する必要があります

a) 一部のフィールドMyModelが完全に表示されないように除外する

b) いくつかのフィールドを表示しますMyModelが、編集できないようにします。

以下のコードを使用してみvalues()ました。クエリセットをフィルタリングして、返してほしい値だけに設定しました。しかし、これは失敗しました。

何か考えがある人はいますか?

class PointTransactionFormset(BaseInlineFormSet):
    def get_queryset(self):
        qs = super(PointTransactionFormset, self).get_queryset()
        qs = qs.filter(description="promotion feedback")
        qs = qs.values('description','points_type') # this does not work
        return qs

class PointTransactionInline(admin.TabularInline):
    model = PointTransaction
    #formset = points_formset()
    #formset = inlineformset_factory(UserProfile,PointTransaction)
    formset = PointTransactionFormset
4

3 に答える 3

12

ドキュメントに記載されていないように思われることの 1 つは、モデル フォームセットのパラメーター内にフォームを含めることができるということです。たとえば、人物モデルフォームがあるとしましょう。これを行うことで、モデルフォームセットで使用できます。

PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6)

これにより、すべてのフォームの検証、除外などをモデルフォーム レベルで実行し、ファクトリに複製させることができます。

于 2011-01-26T03:55:05.787 に答える
6

これは管理者用のフォームセットですか? その場合は、InlineModelAdmin で " exclude = ['field1', 'field2']" を設定して、フィールドを除外します。一部のフィールド値を編集できないように表示するには、 render() メソッドが値を返すだけの単純なカスタム ウィジェットを作成し、 formfield_for_dbfield() メソッドをオーバーライドしてウィジェットを適切なフィールドに割り当てる必要があります。

これが管理者向けではなく、他の場所で使用するためのフォームセットである場合は、フォームセット コンストラクターに渡す ModelForm サブクラスで上記のカスタマイズ (Meta 内部クラスの属性を除外し、__init__ メソッドでウィジェットをオーバーライドする) を行う必要があります。(Django 1.2 以降を使用している場合は、代わりにreadonly_fieldsを使用できます)。

現在の状況 (管理者かどうか) を明確にすれば、コード例で更新できます。

于 2009-03-07T20:30:21.097 に答える
2

私はちょうど同様の問題(管理者向けではなく、ユーザー向けサイト向け)を抱えていて、表示したいフォームセットとフィールドを次のように渡すことができることを発見しましinlineformset_factoryた:

factory = inlineformset_factory(UserProfile, PointTransaction, 
                formset=PointTransactionFormset,
                fields=('description','points_type'))
formset = factory(instance=user_profile, data=request.POST)

はどこuser_profileですかUserProfile

に渡されるフィールド リストに含まれていない必須フィールドが基になるモデルにある場合、これにより検証の問題が発生する可能性があることに注意してくださいinlineformset_factory。ただし、これはあらゆる種類のフォームに当てはまります。

于 2009-09-09T10:43:34.363 に答える