2009-09-12 14 views
15

Czy podczas przeglądania listy zmian administracyjnych dla modelu możliwe jest umieszczenie w kolumnach odpowiadających odsyłaczom kluczy obcych odnośników do odpowiednich stron? Prostym przykładem jest obiekt Foo, który zawiera pasek jako klucz obcy. Jeśli przeglądam listę zmian administracyjnych dla Foo (i ustawię ją tak, aby zawierała słupek w kolumnach display_list), główna kolumna będzie linkiem do strony edycji instancji Foo, podczas gdy kolumna paska będzie łączyła się ze stroną edycji instancji Boo. Rozumiem, że mogę przesłonić używany szablon, ale byłem ciekawy, czy istnieje rozwiązanie, które tego nie wymaga.Zmiana linku do strony zmiany klucza obcego

Odpowiedz

21

Można zdefiniować niestandardową metodę do użycia w liście zmian, która zwraca kod HTML łącza.

from django.core.urlresolvers import reverse 

class MyFooAdmin(admin.ModelAdmin): 
    list_display = ('foo', 'bar_link') 

    def bar_link(self, obj): 
     url = reverse('admin:myapp_bar_change', args=(obj.pk,)) 
     return '<a href="%s">Edit Bar</a>' % url 
    bar_link.allow_tags = True 

Jeden problem z pytaniem jak stwierdził - jeśli Foo ma klucza obcego do baru, to każdy łączy foo na jednym pasku, dzięki czemu można na niej link do strony edycji na tym pasku. Jednak każdy pasek łączy się z wieloma filmami, więc nie ma sensu prosić o link do "strony edycji instancji Foo". Co można zrobić, to link do strony listy zmian dla Foo z filtrem ustawionym pokazać tylko instancje, które linkują do tej Bar:

def foo_link(self, obj): 
     url = reverse('admin:myapp_foo_changelist') 
     return '<a href="%s?bar=%s">See Foos</a>' % (url, obj.pk) 
    foo_link.allow_tags = True 
+0

Dam ci spróbować. Co mam na myśli, łącząc się ze stroną zmiany Foo, to po prostu zachować domyślny link do strony zmiany Foo z listy zmian Foo (przyznaję, że nie było to dla mnie jasne). – Adam

+2

Wszelkie aktualizacje na ten temat w wersji 1.4 lub 1.5 (mam na myśli, że wygląda to na wspaniały dodatek do samego Django, więc może jest już dodany do 'contrib.admin')? –

1

znalazłem i lubiane odpowiedź Daniela, chociaż wariant listy zmian odsunie wszelkie zmiany już to zrobiłem. Jest to więc sposób ustalić, że:

Najpierw trzeba uzyskać odniesienie do wniosku, można to zrobić poprzez owinięcie changelist_view lub queryset jak ja:

class CountryAdmin(ModelAdmin): 
    model = Country 
    list_display = ('pk', 'continent_changelist') 

    # ... 

    def queryset(self, request): 
     self._get_params = request.GET 
     return super(CountryAdmin, self).queryset(request) 

    def continent_changelist(self, obj): 
     url = reverse('admin:yourapp_country_changelist') 
     querystring = self._get_params.copy() 
     querystring['continent__id__exact'] = obj.continent.pk 
     return u'<a href="{0}?{1}">{2}</a>'.format(
      url, querystring.urlencode(), obj.continent) 
    continent_changelist.allow_tags = True 

To daje filtr wewnątrz wierszy listy zmian. Odpowiedziałem na to w innym pytaniu, ale to było miejsce, w którym faktycznie byłem pierwszy, więc chciałem go tutaj nagrać. :-)

Powiązane problemy