2016-01-13 79 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')'(带引号)。 –