簡體   English   中英

在Django模板中隱藏來自ModelForms的外鍵字段

[英]Hiding foreign key fields from ModelForms in Django Template

精華在以下。 我有一些不同的雜志。 模板中的AutoForm會顯示所有文章和所有作者以供選擇(不僅限於當前雜志)。 如何限制作者只選擇當前雜志上的文章? 我可以只使用模板嗎? 如果沒有,那怎么辦?

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>

也許在此條目中的某處存在錯誤(我進行了簡要編輯,從本質上刪除了在這里沒有扮演的角色)。 總的來說,我可以正常工作,只是顯示所有對象,而不是僅顯示當前對象。

聽起來您正在嘗試基於某些條件來限制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)

若要僅在當前雜志上獲得文章作者:

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]))

如果在“文章作者”中有直接的外鍵,則這樣做會更容易。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM