Django MTMField: limit_choices_to = other_ForeignKeyField_on_same_model? - PullRequest
5 голосов
/ 06 декабря 2008

У меня есть пара моделей Django, которые выглядят так:

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

У меня все виды веселья , пытаясь заставить limit_choices_to работать над моделью Галереи. Я только хочу, чтобы администратор показывал варианты фотографий, принадлежащих тому же сайту, что и эта галерея. Это возможно?

Ответы [ 3 ]

4 голосов
/ 10 декабря 2009

Да. Вам необходимо переопределить форму, которую администратор использует для модели Gallery, а затем ограничить набор запросов для поля photos в этой форме:

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)
1 голос
/ 06 декабря 2008

Я бы удалил поле site на моей Photo модели и добавил бы ForeignKey к Gallery. Я бы удалил limit_choices_to из photos полей на Gallery модели.

Поскольку вы используете ForeignKey с Site с, это означает, что сайты не делятся галереями и фотографиями. Поэтому упоминание выше уже бесполезно.

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

Как только вы установите site в галерее, все ее фотографии наследуют это свойство. И сайт будет доступен как photo_instance.gallery.site:

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

Это должно работать так, как если бы у вас было поле site. Но я не проверял это.

Все изменится или, конечно, если вы решите, что галерея или фотография могут появляться на нескольких сайтах.

0 голосов
/ 06 декабря 2008

Согласно документам , "limit_choices_to не имеет никакого эффекта при использовании на ManyToManyField с промежуточной таблицей". Насколько я понимаю, это означает, что это никак не влияет, потому что ManyToManyFields использует промежуточные таблицы ...

Я не пытался заставить его работать на сайте администратора, но из ваших собственных представлений вы можете создать форму и переопределить набор запросов , используемый для заполнения списка вариантов:

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