Selecionando por padrão o site corrente num ManyToManyField(Site, ...)
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
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)
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.
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.
Meu UIN era menor que o seu. :D
Deixar um comentário