2017-05-15 9 views
1

私は、次のFilePathFieldは一意である必要があるモデルがあります:私だけ使用されていないこれらのエントリを表示するには管理者でジャンゴFilePathFieldフィルタ使用エントリ

class Gallery(models.Model): 
    template = models.FilePathField(path=".../templates/galleries/", unique=True) 

を、私はまだ、ドロップダウンリストを希望します利用可能な回答の中から選択をより容易にするためである。

結局のところ、結果のドロップダウンリストに既に使用されているオプションは、とにかくエラーが表示され、管理者に私に表示する必要はありません。残念ながら、私はこの問題を回避するために問題を抱えています。

私は次のように何か挿入することができどこ誰も私に伝えることができます:

used = [gallery.template for gallery in Gallery.objects.all()] 
return [file for file in files if file not in used] 

を...または私はすでに私の望ましい結果を与えることができるどこかのDjangoでオプションを監督しているのでしょうか?どんな助けもありがとう。

+0

フィールド「テンプレート」は一意である必要があるため、管理者のドロップダウンリストには、データベース内の他のエントリに入力されていない、指定された場所にあるファイルのみが表示されます。 –

+0

だから、 ".../templates/galleries /"という2つのテンプレートファイル "a.html"と "b.html"があります。 "a.html"をギャラリーモデルのテンプレートとして設定した最初のエントリを作成した後、Galleryに2番目のエントリを作成する管理者は、フィールドが次のようになっているので、テンプレートのドロップダウンリストに "a.html"ユニークで "a.html"を選択するとエラーになります。さらに、私が選択できる有効なテンプレートを表示するだけのドロップダウンリストを解放します。私はこの例がもう少しそれをクリアすることを願っています!ありがとう! –

答えて

0

多くの掘削の後、私は自分自身で解決策を考え出しました。

モデルのModelAdminを拡張し、名前付きFilePathFieldの選択肢を取り入れ、このリストを好みに合わせてフィルタリングする新しいget_form()メソッドを実装してください。

病気は上記のギャラリーモデルのための例を与える:

class GalleryAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     used = [gallery.template for gallery in Gallery.objects.all()] 
     form = super(GalleryAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['template'].choices = [choice for choice in form.base_fields['template'].choices if choice[0] not in used] 
     return form 

編集:私は、これはもともと、今削除される設定オプションとして、エントリを変更できないように気づきました。私はこの小さな微調整でこれを動作させることができました:

class GalleryAdmin(admin.ModelAdmin): 
    def get_form(self, request, obj=None, **kwargs): 
     if obj: # we are changing an entry 
      used = [gallery.template for gallery in Gallery.objects.all() if gallery.template != obj.template] 
     else: # we are adding a new entry 
      used = [gallery.template for gallery in Gallery.objects.all()] 
     form = super(GalleryAdmin, self).get_form(request, obj, **kwargs) 
     form.base_fields['template'].choices = [choice for choice in form.base_fields['template'].choices if choice[0] not in used] 
     return form 

これは将来誰にでも役立つことを願っています!

関連する問題