2016-01-13 112 views
0

下面的實質。 我有一些不同的雜誌。 AutoForm模板顯示所有文章和所有作者可能的選擇(不僅來自當前雜誌)。如何限制只從當前雜誌的文章的作者選擇?我可以只使用模板來做到這一點嗎?如果沒有,那麼如何?從Django模板中的ModelForms隱藏外鍵字段

models.py

class Magazine(models.Model): 
    Name = models.CharField(max_length=200) 

class Article(models.Model): 
    Name = models.CharField(max_length=200) 
    Magazine = models.ForeignKey(Magazine) 

class Author(models.Model): 
    Name = models.CharField(max_length=200) 
    Magazine = models.ForeignKey(Magazine) 

class Sets(models.Model): 
    Name = models.CharField(max_length=200) 
    Magazine = models.ForeignKey(Magazine) 
    Aut = models.ManyToManyField(Author, null=True, blank=True) 
    Set = models.ForeignKey(Article, null=True, blank=True) 

forms.py:

class MagazineForm(ModelForm): 
    class Meta: 
     model = Magazine 
     fields = {'Name'} 

class ArticleForm(ModelForm): 
    class Meta: 
     model = Article 
     fields = {'Name'} 

class AuthorForm(ModelForm): 
    class Meta: 
     model = Author 
     fields = {'Name'} 

class SetsForm(ModelForm): 
    class Meta: 
     model = Sets 
     fields = {'Name', 'Set', 'Aut'} 

views.py

def building_details(request, magazine_id): 
    sets_form = SetsForm 
    args = {} 
    args.update(csrf(request)) 
    args['magazine'] = Magazine.objects.get(id=magazine_id) 
    args['article'] = Article.objects.filter(Magazine=magazine_id) 
    args['author'] = Author.objects.filter(Magazine=magazine_id) 
    args['sets'] = Sets.objects.filter(Magazine=magazine_id) 
    args['setform'] = sets_form 
    return render_to_response('building.html', args) 

模板

<form action='/add/{{ magazine.id }}/' method='post'> 
{% csrf_token %} 
{{ setform }} 
<input type='submit' class='button' value="Добавить"> 
</form> 
</div> 

也許某處該條目有錯誤(我簡單編輯,刪除這裏就不發揮作用,本質上)。一般來說,我擁有一切正常的工作,除了顯示所有對象,而不是僅顯示當前對象。

回答

0

聽起來就像您試圖根據某些條件來限制ForeignKey選擇器中的選項。

這意味着你需要重寫一些細節的形式__init__方法:

class SetsForm(ModelForm): 
    class Meta: 
     model = Sets 
     fields = {'Name', 'Set', 'Aut'} 

    def __init__(self, *args, **kwargs): 
     articles = Article.objects.filter(Magazine=kwargs.pop('magazine_id')) 
     super(SetsForm, self).__init__(*args, **kwargs) 
     self.fields['articles'] = forms.ModelChoiceField(
      queryset=articles , 
      label="Articles", 
     ) 

然後打電話給你的形式,像這樣:

sets_form = SetsForm(magazine_id=magazine_id) 
+0

謝謝!它看起來像可以工作的東西,但是當我使用你的解決方案時,tyere是錯誤的:name'magazine_id'沒有被定義 –

+0

哎呀,現在應該工作。如果它的有用不要忘記接受或upvote。 – 2016-01-14 02:32:48

+0

非常感謝!但現在有錯誤:'名稱'窗體'未定義'在行'where.ModelChoiceField' –

0

要僅在當前獲得的文章作者雜誌:

articles = Article.objects.filter(Magazine=magazine_id) 
sets = Sets.objects.filter(Magazine=magazine_id, Set__in=articles) 

import itertools 
# build a flat list of all Authors in these sets (and call `set` to avoid duplicates) 
authors = set(itertools.chain(*[s.Aut.all() for s in sets])) 

如果有一個直接foreig這會更容易n作者對文章的關鍵。

另外,您應該按照使用小寫字段名稱的Django約定來遵循。這將避免使用大寫字段的字段和模型之間的混淆。

+0

行謝謝,但我不需要的東西的名單。我需要形式(!)沒有其他鏈接對象的單位(只與當前鏈接)。 –

+0

啊,我明白了。樂高衝鋒隊的答案看起來不錯。它只是有一個錯字:'kwargs.pop('magazine_id')'(帶引號)。 –