2016-11-16 48 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的實例),我需要過濾查詢集:

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對象的實例。我該如何解決這個問題?

編輯 - 我已經想通了,get_formset()確實獲得通過一個實例然而,這種情況下是一篇文章,而不是篩選查詢集所需的SiteArticle。

回答

1

這是我自己想出來的答案。隨意編輯,評論或提供更好的解決方案!

我創建了一個自定義表單來編輯SiteArticles,我使用ModelAdmin的form選項將其傳遞給ArticleAdmin。在這個表單的構造函數中,我基於當前的模型實例對查詢集進行過濾,現在可以使用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() 
相關問題