Manter filtros em Django admin

votos
5

O que eu gostaria de achive é:

  • I ir para o site admin, aplicar alguns filtros para a lista de objetos
  • Eu clique e objeto editar, editar, editar, clique em 'Save'
  • Site me leva para a lista de objetos ... não filtrada. Eu gostaria de ter o filtro do passo 1 lembrado e aplicado.

Existe uma maneira fácil de fazê-lo?

Publicado 07/10/2008 em 08:33
fonte usuário
Em outras línguas...                            


7 respostas

votos
3

Infelizmente não há nenhuma maneira fácil de fazer isso. A filtragem não parece ser salvos em qualquer variável de sessão.

Ao clicar para trás duas vezes é o método normal, mas pode ser unweildy e irritante se você apenas mudou um objeto para que ele não deve mais ser mostrado usando o filtro.

Se é apenas um one-off, clique para trás duas vezes ou ir até a filtragem de novo, é a maneira mais fácil.

Se você estiver indo para estar a filtrar mais frequentemente, ou você só quer aprender sobre hacking do admin (o que é bastante aberto e fácil), você vai querer escrever uma filterspec .

Dê uma olhada aqui e aqui para ver exemplos de pessoas que escrevem seus próprios.

Um realmente, realmente terrível maneira de fazer isso seria para editar a interface de administração para que, depois de clicar em "Salvar", você será redirecionado para você filtrada URL. Eu não recomendo este a todos, mas é uma opção.

Outra forma bastante simples de fazer isso seria escrever uma visão genérica para mostrar seus objetos filtrados, em seguida, usar formulários Django para editar os itens de lá. Eu ter um olhar para isso, você irá se surpreender o quão pouco código você tem que escrever para obter uma página de visualização / edição simples indo.

Respondeu 08/10/2008 em 00:41
fonte usuário

votos
2

Clique 2 vezes "Back"?

Respondeu 07/10/2008 em 09:15
fonte usuário

votos
1

Há um truque simples de fazer isso, mas não é uma solução geral e requer modificando cada ModelAdminqual deseja apoiar esta. Talvez haja uma maneira geral, para fazer isso, mas eu não passei o tempo para resolvê-lo em um nível geral.

O primeiro passo é escrever um costume FilterSpecpara o filtro (ver post de Harley para links que ajudarão) que salva o valor do filtro escolhido na sessão (e exclui-lo quando já não queria).

# in cust_admin/filterspecs.py
from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec

class MyFilterSpec(ChoicesFilterSpec):

    def __init__(self, f, request, params, model, model_admin):
        super(MyFilterSpec, self).__init__(f, request, params, model,
                                           model_admin)
        if self.lookup_val is not None:
            request.session[self.lookup_kwarg] = self.lookup_val
        elif self.lookup_kwarg in request.session:
            del(request.session[self.lookup_kwarg])

# Register the filter with a test function which will apply it to any field
# with a my_filter attribute equal to True
FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'my_filter', False),
                               MyFilterSpec))

Você deve importar o módulo isto é, em algum lugar, por exemplo, o seu urls.py:

# in urls.py
from cust_admin import filterspecs

Definir uma propriedade no campo que deseja aplicar o filtro:

# in models.py
class MyModel(models.Model):
    my_field = Models.IntegerField(choices=MY_CHOICES)
    my_field.my_filter = True

Em um costume ModelAdminclasse, substituir o change_viewmétodo, de modo que após o usuário clicar em salvar , eles são devolvidos para a vista de lista com o seu valor campo de filtro adicionado à URL.

class MyModelAdmin(admin.ModelAdmin):
    def change_view(self, request, object_id, extra_context=None):
        result = super(MyModelAdmin, self).change_view(request, object_id,
                                                       extra_context)
        if '_save' in request.POST:
            if 'my_field__exact' in request.session:
                result['Location'] = '/admin/myapp/mymodel/?my_field__exact=%s' \
                                     % request.session['my_field__exact']
        return result
Respondeu 15/04/2010 em 13:25
fonte usuário

votos
0

Este recurso foi adicionado ao Django como parte da versão 1.6 e é ativado agora por padrão. É descrito nas notas de lançamento :

ModelAdmin agora preserva filtros na exibição de lista depois de criar, editar ou excluir um objeto. É possível restaurar o comportamento anterior de limpar filtros, definindo os preserve_filters atribuir a False.

Respondeu 23/04/2014 em 07:12
fonte usuário

votos
0

Há uma solicitação de mudança no projeto Django pedindo exatamente essa funcionalidade.

Tudo o que está esperando para ser verificados é alguns testes e documentação. Você poderia escrever aqueles, e ajudar o projeto inteiro, ou você pode simplesmente pegar o patch proposto (na parte inferior da página) e experimentá-lo.

https://code.djangoproject.com/ticket/6903

Respondeu 28/02/2012 em 21:36
fonte usuário

votos
0

Na minha opinião o seu melhor para substituir métodos de ModelAdmin changelist_viewe change_view:

Igual a:

class FakturaAdmin(admin.ModelAdmin):

[...]

def changelist_view(self, request, extra_context=None):
    result = super(FakturaAdmin, self).changelist_view(request, extra_context=None)
    request.session['qdict'] = request.GET
    return result

def change_view(self, request, object_id, extra_context=None):
    result = super(FakturaAdmin, self).change_view(request, object_id, extra_context)
    try:
        result['location'] = result['location']+"?"+request.session['qdict'].urlencode()
    except:
        pass
    return result

Como quiser, depois Salvar objeto que você vai voltar para a lista de objetos com filtros ativos.

Respondeu 02/02/2012 em 13:32
fonte usuário

votos
0

Outra maneira de fazer isso é para incorporar o filtro no queryset.

Você pode dinamicamente criar um modelo de procuração com um gerente que filtra a maneira que você quer, em seguida, chamar admin.site.register () para criar um novo modelo de administração. Todas as ligações, então, seria em relação a este ponto de vista.

Respondeu 03/06/2010 em 17:20
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more