2016-11-16 2 views
0

У меня есть база данных статей, которые повторно используются на нескольких сайтах Django. Для каждой статьи также имеется определенная информация по конкретному сайту, хранящаяся в модели SiteArticle. Один бит информации - это список тегов, специфичных для сайта, для каждой SiteArticle. Вот models.py:Как ограничить выбор в InlineAdmin на основе текущего экземпляра?

class Article(models.Model): 
    sites = models.ManyToManyField(Site, through='SiteArticle') 

class SiteArticle(models.Model): 
    site = models.ForeignKey(Site) 
    article = models.ForeignKey(Entiteit) 
    tags = models.ManyToManyField('Tag', blank=True) 

class Tag(models.Model): 
    name = models.CharField(max_length=255) 
    site = models.ForeignKey(Site, related_name='tags') 

Я использую встроенный администратора для редактирования и добавления SiteArticle объектов каждой статьи. Вот admin.py:

class InlineSiteArticle(admin.StackedInline): 
    model = SiteArticle 

@admin.register(Article) 
class ArticleAdmin(admin.ModelAdmin): 
    inlines = [InlineSiteArticle] 

При редактировании статьи, я хотел бы форму рядного SiteArticle к только отображения тегов соответствующего сайта. Я попытался переопределение метода formfield_for_manytomany(), но здесь я не имею доступа к instance переменной (который должен быть экземпляром текущего SiteArticle), что мне нужно фильтровать QuerySet:

def formfield_for_manytomany(self, db_field, request, **kwargs): 
    if db_field.name == "tags": 
     kwargs["queryset"] = instance.site.tags.all() 
          ^^^^^^^^ 
    return super(InlineSiteArticle, self).formfield_for_manytomany(db_field, request, **kwargs) 

я уже смотрел на this Stack Overflow answer, который решает очень связанную проблему. Однако в моем случае мне не нужен доступ к «родительскому» экземпляру, а просто к экземпляру объекта SiteArticle текущей формы. Как я могу это решить?

EDIT - Я уже понял, что get_formset()делает получить экземпляр передается в Тем не менее, этот экземпляр является статья, не SiteArticle нужно фильтровать QuerySet..

ответ

1

Вот ответ, который я понял сам. Не стесняйтесь редактировать, комментировать или предоставлять лучшее решение!

Я создал пользовательскую форму для редактирования SiteArticles, которую я передал в ArticleAdmin, используя параметр form ModelAdmin. В конструкторе этой формы я выполнил фильтрацию набора запросов на основе текущего экземпляра модели, который теперь доступен как self.instance.

class CustomSiteArticleForm(forms.ModelForm): 
    class Meta: 
     model = SiteArticle 
     fields = '__all__' 

    def __init__(self, *args, **kwargs): 
     super(CustomSiteArticleForm, self).__init__(*args, **kwargs) 
     if self.instance.pk: 
      self.fields['tags'].queryset = self.instance.site.tags.all() 
     else: 
      self.fields['tags'].queryset = Tag.objects.none() 
Смежные вопросы