django - gerente de Django para _set no modelo - CoreDump.pt
gerente de Django para _set no modelo
Estou no progresso da aprendizagem Django no momento, mas eu não consigo descobrir como resolver este problema sozinha. Estou lendo o livro Developers Biblioteca - Python desenvolvimento web com Django e em um capítulo que você construir um sistema CMS simples, com dois modelos (História e Categoria), alguns pontos de vista genéricos e personalizados em conjunto com modelos para as vistas.
O livro contém apenas código para histórias da lista, detalhes da história e pesquisa. Eu queria expandir sobre isso e construir uma página com listas aninhadas para categorias e histórias.
Eu consegui descobrir como adicionar minha própria visão object_list genérico para a listagem categoria. Meu problema é que o modelo de história tem STATUS_CHOICES Se a história é público ou não, e um gerenciador customizado que só vai buscar os Stories públicos por padrão. Eu não consigo descobrir como dizer a minha opinião Categoria lista genérica para também usar um gerenciador customizado e só buscar os Stories públicas. Tudo funciona, exceto que pequeno problema. Eu sou capaz de criar uma lista de todas as categorias, com uma lista de sub para todas as histórias dessa categoria em uma única página, o único problema é que a lista contém histórias não públicos.
Eu não sei se estou no caminho certo aqui. Meu urls.py contém uma visão genérica que agrupa todos os objetos categoria e em meu modelo Eu estou usando o category.story_set.all para obter todos os objetos da história para essa categoria, wich Eu, então, varrer.
Eu acho que seria possível adicionar uma declaração se no modelo e usar o VIEWABLE_STATUS do meu arquivo de modelo para verificar se ele deve ser listado ou não. O problema com essa solução é que ela não é muito seco compatível.
É possível adicionar algum tipo de gestor para o modelo Categoria também que só vai buscar em objetos da história públicos ao utilizar o story_set em uma categoria?
Ou esta é a maneira errada de atacar o meu problema?
urls.py (somente lista de categorias de vista):
verbose_name_plural = categories
A hunk of content for our site, generally corresponding to a page
(1, Needs Edit),
(2, Needs Approval),
(3, Published),
(4, Archived),
verbose_name_plural = stories
return (cms-story, (), {'slug': self.slug})
category_list.html (modelo relacionado):
{% extends cms/base.html %}
<ul id=category-list>
<li><a href=` category`.`get_absolute_url `>` category`.`label `</a></li>
<li><a href=` story`.`get_absolute_url `>` story`.`title `</a></li>
Publicado 19/02/2009 em 00:40 2009-02-19 00:40
I encontrar a documentação ligeiramente obscura, mas o atributo pode ser o que você está procurando. Quando você está tentando isso, note que esta funcionalidade utiliza , que será sempre apontar para o primeiro Gerente declarou em uma classe Model, independentemente do que atributo de nome que tem sido dado. Você sempre pode personalizar quais itens são editáveis no seu site de administração, substituindo o método no apropriada classe em vez.use_for_related_fields Manager_default_managerquerysetModelAdmin
Falhando naquilo...
Esta, pelo menos evita duplicar a lógica que determina quais histórias são visíveis.
Respondeu 19/02/2009 em 16:08 2009-02-19 16:08 share
Se você quer uma solução específica modelo que você pode criar um filtro personalizado. Desta forma, você pode evitar tocar sua classe de modelo
Este será o seu filtro:
E você pode usá-lo em seu modelo
{% category.story_set|viewable %}
Respondeu 10/10/2009 em 19:29 2009-10-10 19:29 share
Basta alterar as posições dos seus declarações gerente.
O gerenciador padrão em uma classe ou é o primeiro gerente declarou na classe, se existe, ou o gerente padrão da primeira classe base abstrata na hierarquia pai, se o que existe. Se nenhum gerenciador padrão é explicitamente declarado, gerenciador padrão normais do Django é usado.
Respondeu 13/03/2010 em 02:04 2010-03-13 02:04 share
fonte usuário Edward
Para elaborar resposta de @ insin, você deve adicionar use_for_related_fields = Trueà ViewableManagerclasse. Dessa forma, Category.story_setirá retornar uma instância do gerenciador de costume, que tem o get_query_setmétodo que você precisa. Sua tag será semelhante