11

私のモデルが次のようになっていると仮定します (これは単純化された例です)。

class Person(Model):
  first_name = CharField(...)
  last_name = CharField(...)

  def name():
    return first_name + ' ' + last_name

名前を管理変更リストの単一の列として表示するのは簡単です。ただし、リスト ページから編集可能な単一の編集可能な「名前」フィールドが必要です。これを解析して、モデル フィールドの値を抽出および設定できます。解析は問題ではありません。モデルフィールドに直接対応しないリストページに編集可能なフォームフィールドを作成する方法を考えています。

4

3 に答える 3

35

少し作業すれば、純粋な Python でこれを実行できるはずです。基本的にget_changelist_form、管理クラスのメソッドを使用して、インスタンスのデフォルトではなくカスタム フォームを使用するように指示しModelForm、カスタム フィールドの値を適切に初期化し (フォームのメソッドで最も便利です)、そのフォームの動作を__init__特殊化する必要があります。との値saveを設定します。first_namelast_name

このようなものから始める必要があります。

class PersonChangeListForm(forms.ModelForm):
    class Meta:
        model = Person
    name = forms.CharField()

    def __init__(self, *args, **kwargs):
        instance = kwargs.get('instance')
        if instance:
            initial = kwargs.get('initial', {})
            initial['name'] = '%s %s' % (instance.first_name, instance.last_name)
            kwargs['initial'] = initial
        super(PersonChangeListForm, self).__init__(*args, **kwargs)

    def save(self, *args, **kwargs):
        # use whatever parsing you like here
        first_name, last_name = self.cleaned_data['name'].split(None, 1)
        self.cleaned_data['first_name'] = first_name
        self.cleaned_data['last_name'] = last_name
        return super(PersonChangeListForm, self).save(*args, **kwargs)

class PersonAdmin(admin.ModelAdmin):
    def get_changelist_form(self, request, **kwargs):
        return PersonChangeListForm

また、ブール値としてテストされたときにlist_editableと評価される値を宣言する必要があります。Truelist_editableTrue

編集可能にしたいフィールドが他にない場合、これはさらに複雑になります。クラスの検証では、シーケンス内のすべてが、同様にlist_editable宣言されている編集可能なフィールドである必要があり、表示リンク フィールドではありません。管理クラスのメソッドをオーバーライドして、真でない場合でも完全な処理を使用するか、空の場合でも評価されるorのカスタムサブクラスを定義して、検証に合格できるようにlist_displayするオプションがあると思います。前者は大量の標準コードを繰り返す必要があり、アップグレードした場合にメンテナンスの負担が大幅に増加しますが、後者は直観に反するハックであり、予期しない結果が生じたとしても私はまったく驚かないでしょう.changelist_viewlist_editablelisttupleTrue

どちらも良い選択肢ではないので、 に含める意味のある他のフィールドが少なくとも 1 つあることを願っていますlist_editable

于 2013-10-11T03:29:53.347 に答える
2

管理画面で問題を簡単にモックアップしてみました。モデルで定義されていない list_editable にあるフィールドの管理者検証が失敗したようです。要するに、あなたの質問に対する答えはノーのようです。

ただし、それは実行できないという意味ではありません。少しJavascriptを使用すると、X-editableを使用できます

(または独自のロール)、「名前」列を編集可能にします。ビューを作成してデータを検証し、モデルに保存します。この URL に投稿するには、X 編集可能フィールドの「url」パラメーターを設定します。login_required / permissions_required などでビューを明らかに装飾して、他の誰もデータを編集できないようにします。

于 2013-10-07T20:16:44.853 に答える