Alterar lista link para a página mudança de chave estrangeira
-
06-07-2019 - |
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.
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. : -)