Pergunta

O que eu gostaria de achive é:

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

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

Foi útil?

Solução

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é o filtragem novamente, é 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 .

Tenha um olhar aqui e aqui para exemplos de pessoas escrevendo o seu próprio.

Um realmente, realmente terrível maneira de fazer isso seria a de 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.

Outras dicas

Clique 2 vezes "voltar"?

Há um hack simples de fazer isso, mas não é uma solução geral e requer modificando cada ModelAdmin qual 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 FilterSpec personalizado para o filtro (ver post de Harley para links que vai ajudar) 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 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 uma classe ModelAdmin costume, substituir o método change_view, de modo que após o usuário clicar 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

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

Você pode criar dinamicamente 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.

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

Assim:

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, após salvar objeto que você vai voltar para a lista de objetos com filtros ativos.

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

é tudo o que espera para ser verificados in é 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

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

ModelAdmin agora preserva filtros na exibição de lista depois de criar, editar ou apagar um objecto. É possível restaurar o anterior comportamento de filtros de compensação, definindo o atributo preserve_filters para Falso.

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