Selecionando por padrão o site corrente num ManyToManyField(Site, ...)

Por semente em 13 Out, 2008 12h58 4 comentários

Quem utiliza a django.contrib.sites do Django pode gostar desta dica.

Para quem não conhece, a aplicação sites permite você compartilhar um model com vários outros sites (ou projetos), podendo ter conteúdos iguais (ou em parte) sem redundância, utilizando uma mesma tabela.

No Django 1.0, quando há apenas uma opção para escolha numa ManyToManyField, ela não é selecionada por padrão quando o campo é obrigatório. Antes da versão 1.0 isso não era problema, mas me incomodava o fato de que quando eu tinha mais de uma entrada no model Site, eu deveria escolher o site ao qual eu estava acessando.

Seria interessante pré-selecionar por padrão o site corrente, quando o mesmo é obrigatório e você está acessando sua interface administrativa.

Quando tentei pela última vez fazer isso não obtive sucesso. A idéia era passar para o parâmetro default do ManyToManyField o valor de Site.objects.get_current(). Sem sucesso, não dei mais atenção a isso, mas com o Django 1.0, a cada vez que iria publicar algo neste blog, por exemplo, eu deveria selecionar o site semente.taurinus.org, mesmo sendo o único, a cada texto publicado.

Como todo bom preguiçoso, isso me frustava pois sempre esquecia de marcar o site para ser publicado, causando um erro de validação. Se isso acontece com você meu amigo, eis a solução:

+    from django.conf import settings
@@
-    publish_on = models.ManyToManyField(Site)
+    publish_on = models.ManyToManyField(Site, default=[settings.SITE_ID])

A solução acima já foi aplicada no Diário, aplicação para blog que este site faz uso.

Comentários

  1. Rodrigo (14/10/2008 às 9h33) Link permanente

    Oi semente,

    eu fiz da seguinte maneira. Nessa aplicação cada site só pode postar para seu site.

    site = models.ForeignKey(Site, editable=False)

    def save(self, *args, **kwargs):
    self.site = Site.objects.get_current()
    super(FotosCidade, self).save(*args, **kwargs)

  2. semente (14/10/2008 às 10h56) Link permanente

    Opa Rodrigo!

    Essa é uma boa opção também, até para o caso de uma ManyToMany, principalmente quando se quer limitar a administração de um site apenas para ele e criando um novo site administrativo permitindo a administração de vários.

  3. semente (15/10/2008 às 18h08) Link permanente

    A solução que apresentei aqui primeiramente tinha um bug e foi corrigida (o texto já foi atualizado).

    Você pode conferir a correção da solução na revisão 140 do Diário: <http://code.google.com/p/django-diari...>.

    Na solução anterior, projetos novos ou que não possuíam o pacote ``django.contrib.sites`` previamente instalado em seus projetos não conseguiam rodar o ``syncdb`` para criar as tabelas do Diário.

  4. vchoi (24/10/2008 às 4h37) Link permanente

    Meu UIN era menor que o seu. :D

Deixar um comentário

:

:

:

:

: