2009-07-23 11 views
7

Dostosowuję Django-admin dla aplikacji, nad którą pracuję. więc daleko dostosowywania działa plik, dodano niektóre widoki. ale jestem zastanawiasz się, jak zmienić link rekordów w wyświetlaniu listy zmian do wyświetlać stronę informacyjną zamiast formularza zmiany?!Django-admin: Jak wyświetlić łącze do strony z informacjami o obiekcie zamiast formularza edycji, na liście zmian rekordów?

w tym blogu: http://www.theotherblog.com/Articles/2009/06/02/ rozszerzenie-the-django-admin-interface/Tom powiedział:

"Możesz dodawać zdjęcia lub linki w aukcji zobaczyć definiując funkcję następnie dodając my_func.allow_tags = Prawda "

której nie do końca rozumiem!

Teraz mam funkcję profilu, która jest mi potrzebna, gdy kliknę na element na liście rekordów i mogę go wyświetlić (lub dodać kolejny przycisk nazwany - Profil -), a także jak dodać link dla każdego członka (Edycja: przekieruj mnie do edycji formularza dla tego członka).

Jak mogę to osiągnąć?!

Odpowiedz

20

Jeśli dobrze rozumiem Twoje pytanie, chcesz dodać własny link do widoku aukcji i chcesz, aby ten link wskazywał na stronę informacyjną, którą utworzyłeś.

Aby to zrobić, utwórz funkcję zwracania kodu HTML linku w swoim obiekcie Admin. Następnie użyj tej funkcji na liście. Tak:

class ModelAdmin(admin.ModelAdmin): 
    def view_link(self): 
     return u"<a href='view/%d/'>View</a>" % self.id 
    view_link.short_description = '' 
    view_link.allow_tags = True 
    list_display = ('id', view_link) 
+0

Dzięki to, czego szukałem: D – Hamza

+0

Dzięki ... musiałem wprowadzić jedną drobną modyfikację: 'def view_link (self, o bj): ' –

9

Spójrz: http://docs.djangoproject.com/en/dev/ref/contrib/admin/, ModelAdmin.list_display część, to mówi: ciąg reprezentujący atrybut na modelu. Zachowuje się prawie tak samo, jak można wywoływać, ale w tym kontekście self jest instancją modelu. Oto pełna przykład model:

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    color_code = models.CharField(max_length=6) 

def colored_name(self): 
    return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name) 
colored_name.allow_tags = True 

class PersonAdmin(admin.ModelAdmin): 
    list_display = ('first_name', 'last_name', 'colored_name') 

Więc myślę, jeśli dodać te dwie metody Osoba

def get_absolute_url(self): 
    return '/profiles/%s/' % (self.id) 

def profile_link(self): 
    return '<a href="%s">%s</a>' % (self.get_absolute_url(), self.username) 
profile_link.allow_tags = True 

i zmienia PersonAdmin do

class PersonAdmin(admin.ModelAdmin): 
    list_display = ('first_name', 'last_name', 'colored_name', 'profile_link') 

Wtedy wykonanej

+0

Wow, dziękuję, że było bardzo przydatne. Jeszcze raz dziękuję – Hamza