Para conseguir isso e ter um link 'Todos' utilizável em sua barra lateral (ou seja, um que mostra tudo em vez de mostrar pendentes), você precisa criar um filtro de lista personalizado, herdando de django.contrib.admin.filters.SimpleListFilter
e filtrando por 'pendente' por padrão. Algo nesse sentido deve funcionar:
from datetime import date
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin import SimpleListFilter
class StatusFilter(SimpleListFilter):
title = _('Status')
parameter_name = 'status'
def lookups(self, request, model_admin):
return (
(None, _('Pending')),
('activate', _('Activate')),
('rejected', _('Rejected')),
('all', _('All')),
)
def choices(self, cl):
for lookup, title in self.lookup_choices:
yield {
'selected': self.value() == lookup,
'query_string': cl.get_query_string({
self.parameter_name: lookup,
}, []),
'display': title,
}
def queryset(self, request, queryset):
if self.value() in ('activate', 'rejected'):
return queryset.filter(status=self.value())
elif self.value() == None:
return queryset.filter(status='pending')
class Admin(admin.ModelAdmin):
list_filter = [StatusFilter]
EDITAR: Requer Django 1.4 (obrigado Simon)
choices
método na solução, ele continuará irritantemente a adicionar sua própria opção Todos no topo da lista de opções.fonte
Retirou a resposta de ha22109 acima e modificou para permitir a seleção de "Todos" comparando
HTTP_REFERER
ePATH_INFO
.fonte
KeyError
, enquanto se você usar oget()
método do dict, você pode especificar um padrão. Especifiquei um padrão de string vazia para que split () não lanceAttributeError
. Isso é tudo.has_key()
é preterido em favor dekey in d
, no entanto. Mas eu sei que você acabou de tirar a resposta de ha22109. Uma pergunta: por que usarrequest.META['PATH_INFO']
quando você poderia apenas usarrequest.path_info
(mais curto)?Eu sei que esta questão é bastante antiga agora, mas ainda é válida. Acredito que essa seja a maneira mais correta de fazer isso. É essencialmente o mesmo que o método de Greg, mas formulado como uma classe extensível para fácil reutilização.
fonte
Aqui está minha solução genérica usando redirecionamento, ele apenas verifica se há algum parâmetro GET; se nenhum existir, ele redireciona com o parâmetro get padrão. Eu também tenho um list_filter definido para que ele pegue e exiba o padrão.
A única ressalva é quando você acessa diretamente a página com "?" presente na url, não há HTTP_REFERER definido, então ele usará o parâmetro padrão e o redirecionará. Isso é bom para mim, funciona muito bem quando você clica no filtro de administrador.
ATUALIZAÇÃO :
Para contornar a advertência, acabei escrevendo uma função de filtro personalizado que simplificou a funcionalidade changelist_view. Aqui está o filtro:
E o changelist_view agora só passa o parâmetro padrão se nenhum estiver presente. A ideia era livrar-se da capacidade dos filtros genéricos de visualizar tudo sem usar parâmetros get. Para ver todos atribuímos o status = 8 para esse propósito:
fonte
fonte
Você pode simplesmente usar
return queryset.filter()
ouif self.value() is None
e o método Override de SimpleListFilterfonte
Observe que, se em vez de pré-selecionar um valor de filtro, você quiser sempre pré-filtrar os dados antes de mostrá-los no admin, você deve substituir o
ModelAdmin.queryset()
método.fonte
Uma pequena melhoria na resposta de Greg usando DjangoChoices, Python> = 2.5 e claro Django> = 1.4.
Obrigado a Greg pela boa solução!
fonte
Eu sei que não é a melhor solução, mas mudei o index.html no modelo de admin, linha 25 e 37 assim:
25:
<th scope="row"><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag_flag__exact=1{% endifequal %}">{{ model.name }}</a></th>
37:
<td><a href="{{ model.admin_url }}{% ifequal model.name "yourmodelname" %}?yourflag__exact=1{% endifequal %}" class="changelink">{% trans 'Change' %}</a></td>
fonte
Tive que fazer uma modificação para que a filtragem funcionasse corretamente. A solução anterior funcionou para mim quando a página carregou. Se uma 'ação' foi realizada, o filtro voltou para 'Todos' e não para o meu padrão. Esta solução carrega a página de alteração do administrador com o filtro padrão, mas também mantém as alterações do filtro ou o filtro atual quando outra atividade ocorre na página. Não testei todos os casos, mas na realidade isso pode estar limitando a configuração de um filtro padrão para ocorrer apenas quando a página carrega.
fonte
Um pouco fora do assunto, mas minha busca por uma questão semelhante me trouxe até aqui. Eu queria ter uma consulta padrão por uma data (ou seja, se nenhuma entrada for fornecida, mostre apenas objetos com
timestamp
de 'Hoje'), o que complica um pouco a questão. Aqui está o que eu descobri:Esta é uma substituição simples do padrão
DateFieldListFilter
. Ao definirself.date_params
, ele garante que o menu suspenso do filtro será atualizado para qualquer opção que corresponda aself.used_parameters
. Por esse motivo, você deve garantir queself.used_parameters
são exatamente o que seria usado por uma dessas seleções suspensas (ou seja, descobrir o quedate_params
seria ao usar 'Hoje' ou 'Últimos 7 dias' e construir oself.used_parameters
para corresponder a eles).Isto foi construído para funcionar com Django 1.4.10
fonte
Este pode ser um tópico antigo, mas pensei em adicionar minha solução, pois não consegui encontrar respostas melhores nas pesquisas do Google.
Faça o que (não tenho certeza se é Deminic Rodger ou ha22109) respondeu no ModelAdmin para changelist_view
Em seguida, precisamos criar um SimpleListFilter personalizado
fonte
Esta é a versão mais limpa que consegui gerar de um filtro com 'Todos' redefinido e um valor padrão selecionado.
Se me mostra por padrão as viagens que estão acontecendo no momento.
fonte
Criou uma subclasse de Filtro reutilizável, inspirada por algumas das respostas aqui (principalmente de Greg).
Vantagens:
Reutilizável - conectável em qualquer
ModelAdmin
classe padrãoExtensível - Fácil de adicionar lógica adicional / personalizada para
QuerySet
filtragemFácil de usar - Em sua forma mais básica, apenas um atributo personalizado e um método personalizado precisam ser implementados (além daqueles exigidos para a subclasse SimpleListFilter)
Admin intuitivo - O link de filtro "Todos" está funcionando conforme o esperado; como são todos os outros
Sem redirecionamentos - não há necessidade de inspecionar a
GET
carga útil da solicitação, independente deHTTP_REFERER
(ou qualquer outro material relacionado à solicitação, em sua forma básica)Não (changelist) manipulação de visualização - E nenhuma manipulação de template (deus me livre)
Código:
(a maioria dos
import
s são apenas para dicas de tipo e exceções)Exemplo de uso completo:
Espero que isso ajude alguém; feedback sempre apreciado.
fonte