2009-04-07 13 views
15

Modelimin admin.py sınıfına 'highlight_link' yöntemini ekledim:Django Yöneticisi: list_display yöntemleri için admin.py'deki istek nesnesine nasıl erişilir?

class RadioGridAdmin(admin.ModelAdmin): 

    list_display = ('start_time', highlight_link) 

    def highlight_link(self): 
     return ('some custom link') 


admin.site.register(RadioGrid, RadioGridAdmin) 

Değişiklik listesinde geri dönen her kayıt için (kısaltması için highlight_link.short_description yazdım) özel bir bağlantı döndürüyor . Hangisi harika. Ancak mevcut sorgu dizesini incelemek ve buna göre özel bağlantıyı değiştirmek istiyorum. 'Highlight_link' içindeki Request nesnesine erişmenin bir yolu var mı?

+0

içinde self.request kullanabilirsiniz .djangoproject.com/ticket/13659 – Paolo

cevap

0

Denedim Diğer cevaplar burada kaldı ve benim için karmaşık hale gelen konular arasındaydı. Ben def __call__() ile oynadım ve aşağıdaki ile geldi. Bu muhtemelen bunu yapmak için doğru bir yol değildir, ancak (benim ilk post yukarıda açıklandığı gibi sınıf RadioGridAdmin içinde) burada

kapmak GET değişkeni ... çalışır:

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

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

beri küresel, sen şimdi buradan erişebilirsiniz:

bu nesi var
def highlight_link(self): 
    # access start_date here 
+3

Globals çok parçalı ortamlar bağlamında tehlikelidir apache sunucusunda mod_phyton olarak çalışıyor. – Ber

3

Bunu gerçekleştirmenin doğrudan bir yolu yoktur. 2 olası çözüm görüyorum.

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') 
: Sadece nitelik olarak istek nesnesini kaydetmek için basit olmayan dişli Django kurulumu mümkün olduğu kullanıyorsanız
  • aynı istek nesnesi

    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') 
    
  • bir iplik halk mağaza kullanın

+0

Eğer basit ** non ** - thr kullanıyorsanız "Django montajı" mı? –

+0

Evet, tabiki. Bu benim yazım hatası. –

+0

Bu iki senaryodan birini veya diğerini kullanan etki nedir? – Gelbander

15
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) 
+0

çok zarif bir yoldur ancak kod bazı hatalar var: "(obj kendini) def highlight_link:" olmalıdır ve "süper: "def highlight_link (self)" (RadioGridAdmin, self) .changelist_view (...) " önde" geri "olmalıdır. – jnns

+6

Bu konuafe değil. Yerel bir konu bunu çözecektir. –

+1

@CollinAnderson Neden threadafe değil? Bana açıklar mısın? Teşekkürler! – mozillazg

-2

:

def highlight_link(self, request): 
    # access start_date here 
+2

Vurgulama bağlantısının kendisine gönderilen istek nesnesini alacağına inanmıyorum. –

+1

Bir yöntem alan olarak listelendiğinde, alan için HTML'yi oluşturmak üzere otomatik olarak çağrılır ve belirli bir argüman kümesiyle çağrılır, 'request' bunlardan biri değildir. Sadece yöntem imzasına eklemek, nasıl çağrıldığını değiştirmez. – brianmearns

11

Ben Solv meselem bu şekilde. https: // kod

class MyClassAdmin(admin.ModelAdmin): 

    def queryset(self, request): 
     qs = super(MyClassAdmin, self).queryset(request) 
     self.request = request 
     return qs 

Şimdi ben herhangi bir yerde

GÜNCELLEME

Changed in Django 1.6: The get_queryset method was previously named queryset.

class MyClassAdmin(admin.ModelAdmin): 

    def get_queryset(self, request): 
     qs = super(MyClassAdmin, self).get_queryset(request) 
     self.request = request 
     return qs 
+0

Hala çalışıyor gibi görünüyor, ancak 'queryset' artık' get_queryset' ile değiştirilmelidir. – sebhaase

+2

Halen 1.9'da çalışıyor ancak 'queryset' artık' get_queryset' ile değiştirilmelidir. – sebhaase

+0

@sebhaase Teşekkürler, cevabımı güncelledim. –

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() 
     # ... 
bu ilgili bilet işaret etmek istiyorum
+0

Merhaba, django 1.9.6 'django.core import get_thread_local_request ifadesiyle' ImportError: 'get_thread_local_request' adını alamıyor. Herhangi bir yardım? – Paolo

+0

@Paolo güncellemesi;) – react

İlgili konular