0

AutoFieldであるPK--locidを含むモデルMyModelがあります。

これからモデルフォームセットを作成したいのですが、いくつか注意点があります。

  • フォームセットのクエリセットは、all()ではなくカスタムクエリセット(たとえば、order_by('field'))である必要があります。
  • MyModelのlocidはAutoFieldであり、デフォルトで非表示になっているため、ユーザーに表示できるようにしたいと思います。

これを行う方法がわかりません。私は複数のアプローチを試しましたが、

MyModelFormSet = modelformset_factory(MyModel, fields=('locid', 'name', 'dupof'))

上記は私に3つのフィールドを与えますが、locidは隠されています。

class MyModelForm(ModelForm):

  def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    self.fields['locid'].widget.attrs["type"] = 'visible'
    locid = forms.IntegerField(min_value = 1, required=True)

  class Meta:
    model = MyModel
    fields = ('locid', 'name', 'dupof')

上記は私にManyToManyエラーを与えます。

誰かが以前にこのようなことをしたことがありますか?


編集2

フォームセットをインスタンス化するときにカスタムクエリを使用できるようになりましたが、IDはアプリケーションの使用にとって重要であるため、ユーザーにlocidフィールドを表示する必要があります。どうすればいいですか?オートフィールドの場合、PKを非表示にするデフォルトの動作をオーバーライドする方法はありますか?

4

3 に答える 3

2

自動インクリメントされた主キーであるため、自動フィールドをユーザーに表示しても意味がありません。ユーザーはそれを変更できず、レコードをデータベースに保存する前に使用できません (DBMS が次に使用可能な ID を選択します)。

これは、フォームセットのカスタム クエリセットを設定する方法です。

from django.forms.models import BaseModelFormSet

class OrderedFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        self.queryset = MyModel.objects.order_by("field")
        super(OrderedFormSet, self).__init__(*args, **kwargs)

次に、ファクトリ関数でそのフォームセットを使用します。

MyModelFormSet = modelformset_factory(MyModel, formset=OrderedFormSet)
于 2009-05-22T11:16:38.687 に答える
1

ここで述べたように、これを行うためにテンプレート側の変数を使用することになりました。

ジャンゴフォームセットで非表示のオートフィールドを表示する方法

于 2009-05-26T21:35:34.087 に答える
0

安価な回避策が好きな場合はlocid__unicode__メソッドにマングルしてみませんか?ユーザーはそれを見ることが保証されており、django-adminの特別な知識は必要ありません。

しかし、公平を期すために、django-adminに関連する質問に対する私の回答はすべて、「django-adminを汎用のCRUDインターフェイスにするのに苦労しないでください」という線に沿っている傾向があります。

于 2009-05-24T01:38:21.063 に答える