Pergunta

Ao visualizar a listagem do admin para um modelo, é possível fazer as colunas que correspondem às ligações de chaves estrangeiras para suas respectivas páginas? Um exemplo simples é que tenho um objeto Foo que contém Bar como uma chave estrangeira. Se eu estou vendo a listagem do admin para Foo (e tê-lo definido para incluir Bar nas colunas display_list), a coluna principal seria conectar-se a página de edição da instância Foo enquanto a coluna Bar ligaria a página de edição da instância Boo. Eu entendo que eu posso substituir o modelo que é usado, mas eu estava curioso para saber se havia uma solução que não exigisse isso.

Foi útil?

Solução

Você pode definir um método personalizado para usar na lista de alterações que retorna o HTML do link.

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 

Um problema com a sua pergunta como afirmou - se Foo tem uma chave estrangeira para Bar, em seguida, cada foo links para uma única barra, então você pode ligar para a página de edição para esse bar. No entanto, cada barra de links para vários foos, por isso não faz sentido para pedir um link para a página de edição da instância Foo '. O que você pode fazer é link para a página de listagem de Foo com o conjunto de filtros para mostrar apenas as instâncias que apontam para este 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 

Outras dicas

Eu encontrei e gostava de resposta de Daniel, embora a variante de alterações afasta qualquer mudança que você já fez. Portanto, esta é uma maneira de corrigir isso:

Primeiro você precisa obter uma referência para o pedido, você pode fazer isso por changelist_view acondicionamento ou queryset como eu fiz:

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

Isso lhe dará um filtro dentro das linhas de changelists. Eu respondi isso em outra pergunta, mas este foi o lugar que eu realmente veio primeiro, por isso queria gravá-la aqui. : -)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top