5

Tengo un par de modelos de Django que se ven así:Django MTMField: limit_choices_to = other_ForeignKeyField_on_same_model?

from django.contrib.sites.models import Site 

class Photo(models.Model): 
    title = models.CharField(max_length=100) 
    site = models.ForeignKey(Site) 
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self): 
     return self.title 


class Gallery(models.Model):  
    name = models.CharField(max_length=40) 
    site = models.ForeignKey(Site) 
    photos = models.ManyToManyField(Photo, limit_choices_to = {'site':name})  

    def __unicode__(self): 
     return self.name 

estoy teniendo todo tipo de diversión tratando de obtener el limit_choices_to trabajando en el modelo de la Galería. Solo quiero que el administrador muestre las opciones de fotos que pertenecen al mismo sitio que esta galería. es posible?

Respuesta

1

me gustaría eliminar site campo en mi modelo Photo y añadir un ForeignKey a Gallery. Quitaría limit_choices_to de photos campos en el modelo Gallery.

Dado que está utilizando ForeignKey s en Site s, eso significa que los sitios no comparten galerías y fotos. Por lo tanto, tener los que mencioné anteriormente ya es inútil.

class Photo(models.Model): 
    title = models.CharField(max_length=100) 
    gallery = models.ForeignKey(Gallery, related_name='photos') 
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self): 
     return self.title 


class Gallery(models.Model):  
    name = models.CharField(max_length=40) 
    site = models.ForeignKey(Site) 

    def __unicode__(self): 
     return self.name 

Una vez ajustado el site en una galería de todas sus fotos heredarán esta propiedad. Y el sitio será accesible como photo_instance.gallery.site:

@property 
def site(self): 
    return self.gallery.site 

Esto debería funcionar como si tuviera un campo site. Pero no lo he probado.

Las cosas cambian o, por supuesto, si decide que una galería o una fotografía pueden aparecer en varios sitios.

+0

ahh - esto es un mejor diseño. Gracias. – saturdayplace

+3

Último comentario ... Esto resuelve el problema del asker con un mejor diseño, ¡pero no responde la pregunta! Tengo el mismo problema pero no se puede hacer el cambio de diseño. Es como un usuario personalizado que tiene un conjunto de opciones posibles (M2M a opciones) que solo un administrador de alto nivel puede cambiar, pero entre ellas un conjunto de opciones activas (segundo M2M a Opciones, elección entre las de la primera lista). Los subconjuntos del mismo conjunto de opciones se deben asignar también a otros objetos, por lo que no es posible invertir las relaciones. – rewritten

0

De acuerdo con docs, "limit_choices_to no tiene ningún efecto cuando se usa en ManyToManyField con una tabla intermedia". Según mi lectura, eso significa que no tiene ningún efecto, porque ManyToManyFields usa tablas intermedias ...

No he intentado que funcione en el sitio de administración, pero desde sus propias vistas, puede crear un formulario y override the queryset utilizarse para rellenar la lista de opciones:

form.fields["photos"].queryset = request.user.photo_set.all() 
3

Sí. Necesita anular la forma que de administración utiliza para el modelo Gallery, a continuación, limitar la queryset del campo photos en esa forma:

class GalleryAdminForm(django.forms.ModelForm): 

    class Meta: 
     model = Gallery 

    def __init__(self, *args, **kwargs): 
     super(GalleryAdminForm, self).__init__(*args, **kwargs) 
     self.fields['segments'].queryset = Photo.objects.filter(site=self.instance.site) 


class GalleryAdmin(django.contrib.admin.ModelAdmin): 
    form = GalleryAdminForm 

django.contrib.admin.site.register(Gallery, GalleryAdmin)