5

Ich habe ein paar django Modelle bekamen die wie folgt aussehen:Django MTMField: limit_choices_to = anderes_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 

ich alle Arten von Spaß versuchen, die limit_choices_to Arbeiten an der Galerie-Modell zu bekommen. Ich möchte nur, dass der Administrator Auswahlmöglichkeiten für Fotos anzeigt, die zur selben Site wie diese Galerie gehören. Ist das möglich?

Antwort

1

I site Feld auf meinem Photo Modell löschen würde und fügen Sie eine ForeignKey-Gallery. Ich würde limit_choices_to von photos Felder auf Gallery Modell entfernen.

Da Sie ForeignKey s zu Site s verwenden, bedeutet das, dass Websites keine Galerien und Fotos teilen. Deshalb ist es schon nutzlos, die oben genannten zu haben.

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 

Sobald Sie die site auf einer Galerie alle seine Fotos setzen diese Eigenschaft erben. Und die Website zugänglich sein, wie photo_instance.gallery.site:

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

Dies sollte funktionieren, als ob Sie ein site Feld hatten. Aber ich habe es nicht getestet.

Dinge ändern sich oder Kurs, wenn Sie entscheiden, dass eine Galerie oder ein Foto in mehreren Websites angezeigt werden kann.

+0

ahh - das ist ein besseres Design. Vielen Dank. – saturdayplace

+3

später Kommentar ... Dies löst das Problem des Fragestellers mit einem besseren Design, aber beantwortet die Frage nicht! Ich habe das gleiche Problem, aber die Designänderung kann nicht durchgeführt werden. Es ist wie ein CustomUser mit einer Reihe von möglichen Optionen (M2M zu Optionen), die nur ein High Level Manager ändern kann, aber darunter eine Reihe von aktiven Optionen (zweite M2M zu Optionen, Auswahl unter den in der ersten Liste). Untergruppen derselben Optionsgruppe müssen auch anderen Objekten zugewiesen werden, sodass das Rückgängigmachen von Beziehungen nicht möglich ist. – rewritten

0

Nach der docs, "Limit_choices_to hat keine Wirkung, wenn auf einem ManyToManyField mit einer Zwischentabelle verwendet". Durch mein Lesen bedeutet das, dass es überhaupt keine Wirkung hat, weil ManyToManyFields Zwischentabellen verwendet ...

Ich habe nicht versucht, es in der Admin-Site funktionieren zu lassen, aber aus Ihren eigenen Ansichten können Sie ein Formular erstellen und override the queryset verwendet, um die Auswahlliste zu füllen:

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

Ja. Sie müssen die Form außer Kraft zu setzen, dass Admin für das Gallery Modell verwendet, begrenzen Sie die queryset des photos Feld in dieser Form:

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)