2016-10-27 5 views
1

Djangoの管理者リストビューでは、名前のない製品を非表示にしたいと思います。私はそれらをget_query_set()メソッドで除外しました。Django - Filter QuerySetは管理者の詳細ページにありません。

def get_queryset(self, request): 
    qs = super(ProductAdmin, self).get_queryset(request) 
    return qs.exclude(name=None) 

これは完璧な作業ですが、私は(直接リンク付き)管理者の詳細ページに名前のない製品にアクセスできるようにしたいです。それはこれをしようとすると、それはクエリセットのうちの製品をフィルタリングするため 、私は、エラーを持っている:主キーu'123' が http://127.0.0.1/product/123

製品オブジェクトは存在しません。

この問題の回避策はありますか?可能であれば、カスタムフィルタをリストビューに追加することはありません。

答えて

1

さて、あなたはこれが文書化されていませんが、動作させることができget_object

def get_object(self, request, object_id, from_field=None): 
    """ 
    Returns an instance matching the field and value provided, the primary 
    key is used if no field is provided. Returns ``None`` if no match is 
    found or the object_id fails validation. 
    """ 

    model = product 
    field = model._meta.pk if from_field is None else model._meta.get_field(from_field) 
    try: 
     object_id = field.to_python(object_id) 
     return model.objects.get(**{field.name: object_id}) 
    except (model.DoesNotExist, ValidationError, ValueError): 
     return None 

をオーバーライドすることができます。カスタムフィルタを使用するのが標準的な方法です。

0

あなたはchangeまたはchangelist

def get_queryset(self, request): 
    qs = super(ProductAdmin, self).get_queryset(request) 
    if request.resolver_match.url_name == "APPNAME_MODELNAME_changelist": 
     return qs.exclude(name=None) 
    return qs 

Djangoのバージョンであるかどうかを確認できます:1.9

+0

また、これは良い解決策、THXです:) –

関連する問題