31

highlight_linkモデルのadmin.pyクラスにメソッドを追加しました。

class RadioGridAdmin(admin.ModelAdmin):
    
    list_display = ('start_time', highlight_link)
    
    def highlight_link(self):
        return ('some custom link')
    
    
admin.site.register(RadioGrid, RadioGridAdmin)

highlight_link.short_description変更リストで返された各レコードのカスタムリンクを返します(簡潔にするために省略しました)。これは素晴らしいことです。ただし、現在のクエリ文字列を調べて、それに基づいてカスタムリンクを変更したいと思います。内のリクエストオブジェクトにアクセスする方法はありますhighlight_linkか?

4

10 に答える 10

19
class RadioGridAdmin(admin.ModelAdmin):

    def highlight_link(self, obj):
        return (self.param)

   def changelist_view(self, request, extra_context=None):
        self.param = request.GET['param']
        return super(RadioGridAdmin,self).changelist_view(request, extra_context=extra_context)
于 2009-04-08T13:01:29.500 に答える
3

これを行う直接的な方法はありません。2つの可能な解決策があります。

  • 同じリクエスト オブジェクトにスレッド ローカル ストアを使用する

    from django.utils._threading_local import locals
    
    globals = locals()
    
    class RadioGridAdmin(admin.ModelAdmin):
      def __call__(self, request, *args, **kwargs):
          globals['radio_grid_admin_request'] = request
          return super(RadioGridAdmin, self).__call__(request, *args, **kwargs)
    
      def highlight_link(self):
          request = globals['radio_grid_admin_request']
          # request.GET processing
          return ('some custom link')
    
  • シンプルなスレッド化されていない Django インストールを使用している場合は、リクエスト オブジェクトを属性として保存することができます。

    class RadioGridAdmin(admin.ModelAdmin):
      def __call__(self, request, *args, **kwargs):
          self.request = request
          return super(RadioGridAdmin, self).__call__(request, *args, **kwargs)
    
      def highlight_link(self):
          # self.request.GET processing
          return ('some custom link')
    
于 2009-04-08T04:48:11.870 に答える
0

ここに残っている他の回答を試してみたところ、複雑になっている問題に遭遇しました。私は遊んdef __call__()で、次のことを思いつきました。これはおそらくこれを行う正しい方法ではありませんが、機能します...

ここで GET 変数を取得します (上記の最初の投稿で説明したように、すべて RadioGridAdmin クラス内にあります)。

def __call__(self, request, url):
     global start_date
     start_date = request.GET['param']

     return super(RadioGridAdmin, self).__call__(request, url)

グローバルなので、ここからアクセスできます。

def highlight_link(self):
    # access start_date here
于 2009-04-16T21:00:18.130 に答える
0
import threading

_thread_local = threading.local()

def get_thread_local_request():
    return getattr(_thread_local, "request", None)

class RadioGridAdmin(admin.ModelAdmin):
    list_display = ('display_field', ...)

    def display_field(self, obj):
        # ...
        request = get_thread_local_request()
        # ... 
于 2016-05-13T12:48:07.177 に答える
-2

これの何が問題なのですか:

def highlight_link(self, request):
    # access start_date here
于 2009-05-04T18:12:46.153 に答える