django - roma - ultimi siti unesco italia




Visualizzazione delle chiavi esterne nella lista dell'amministratore di Django (2)

Non penso ci sia un meccanismo per fare ciò che vuoi automaticamente fuori dalla scatola.

Ma per quanto riguarda la determinazione del percorso verso una pagina di modifica dell'amministratore basata sull'id di un oggetto, tutto ciò che serve sono due informazioni:

a) self.model._meta.app_label

b) self.model._meta.module_name

Quindi, ad esempio, per andare alla pagina di modifica per quel modello si farebbe:

'../%s_%s_change/%d' % (self.model._meta.app_label, self.model._meta.module_name, item.id)

Dai un'occhiata a django.contrib.admin.options.ModelAdmin.get_urls per vedere come lo fanno.

Suppongo che potresti avere un callable che prende il nome di un modello e un id, crea un modello del tipo specificato solo per ottenere l'etichetta e il nome (non c'è bisogno di colpire il database) e genera l'URL sopra.

Ma sei sicuro di non riuscire a usare la Inline? Rappresenterebbe un'interfaccia utente migliore per avere tutti i componenti correlati in un'unica pagina ...

Modificare:

Inlines (collegato ai documenti) consente a un'interfaccia di amministrazione di visualizzare una relazione padre-figlio in una pagina anziché suddividerla in due.

Nell'esempio Post / Autore che hai fornito, l'uso di inline significherebbe che la pagina per la modifica di Post mostrerebbe anche un modulo in linea per aggiungere / modificare / rimuovere Autori. Molto più naturale per l'utente finale.

Quello che puoi fare nella tua vista elenco admin è creare un chiamabile nel modello Post che renderà un elenco separato da virgole di Autori. Così avrai la tua vista elenco dei post che mostra gli autori appropriati e modifichi gli autori associati a un post direttamente nell'interfaccia di amministrazione Post.

Se un modello di django contiene un campo chiave esterna e se tale campo viene visualizzato in modalità elenco, viene visualizzato come testo , anziché visualizzare un collegamento all'oggetto esterno.

È possibile visualizzare automaticamente tutte le chiavi esterne come link anziché testo piatto?

(Ovviamente è possibile farlo sul campo, ma esiste un metodo generale?)

Esempio :

class Author(models.Model):
    ...

class Post(models.Model):
    author = models.ForeignKey(Author)

Ora scelgo un ModelAdmin in modo tale che l'autore si presenti in modalità elenco:

class PostAdmin(admin.ModelAdmin):
    list_display = [..., 'author',...]

Ora in modalità elenco, il campo autore utilizzerà solo il metodo __unicode__ della classe Author per visualizzare l'autore. In cima a ciò vorrei un collegamento che punta all'URL dell'autore corrispondente nel sito di amministrazione. È possibile?

Metodo manuale :

Per completezza, aggiungo il metodo manuale. Sarebbe opportuno aggiungere un metodo author_link nella classe PostAdmin :

def author_link(self, item):
    return '<a href="../some/path/%d">%s</a>' % (item.id, unicode(item))
author_link.allow_tags = True

Questo funzionerà per quel particolare campo ma non è quello che voglio. Voglio un metodo generale per ottenere lo stesso effetto. (Uno dei problemi è come capire automaticamente il percorso di un oggetto nel sito admin di django.)


Stavo cercando una soluzione allo stesso problema e ho trovato questa domanda ... ho finito per risolverlo da solo. L'OP potrebbe non essere più interessato ma potrebbe comunque essere utile a qualcuno.

from functools import partial
from django.forms import MediaDefiningClass

class ModelAdminWithForeignKeyLinksMetaclass(MediaDefiningClass):

    def __getattr__(cls, name):

        def foreign_key_link(instance, field):
            target = getattr(instance, field)
            return u'<a href="../../%s/%s/%d">%s</a>' % (
                target._meta.app_label, target._meta.module_name, target.id, unicode(target))

        if name[:8] == 'link_to_':
            method = partial(foreign_key_link, field=name[8:])
            method.__name__ = name[8:]
            method.allow_tags = True
            setattr(cls, name, method)
            return getattr(cls, name)
        raise AttributeError

class Book(models.Model):
    title = models.CharField()
    author = models.ForeignKey(Author)

class BookAdmin(admin.ModelAdmin):
    __metaclass__ = ModelAdminWithForeignKeyLinksMetaclass

    list_display = ('title', 'link_to_author')

Sostituisci 'partial' con Django's 'curry' se non stai usando python> = 2.5.





foreign-keys