Django - 将ModelChoiceField限制为有效值

时间:2011-06-01 16:16:13

标签: python django django-models

Models.py:

class Comment(models.Model):
    user = models.ForeignKey(User)
    document = models.ForeignKey(Document)
    section = models.ForeignKey(Section, null=True, blank=True)
    description = models.TextField(null=True, blank=True)

Forms.py:

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        fields = ('section', 'description')

每个评论属于文档的一个部分。每份文件都有很多章节。但是,由Django打印出来的ModelChoiceField将包含所有文档的部分。

如何告诉Django只打印属于特定文档的章节?

我看了ModelFormSets - Changing the queryset,但我认为这不是我想要的。

2 个答案:

答案 0 :(得分:2)

如果你需要做的只是调整管理站点,你可以覆盖django管理员类的formfield_for_foreignkey方法。

来自文档:

  

ModelAdmin.formfield_for_foreignkey(self,db_field,request,** kwargs)

     

ModelAdmin上的formfield_for_foreignkey方法允许您覆盖   外键字段的默认表单字段。例如,返回子集   对于此外键字段的对象,基于用户:

class MyModelAdmin(admin.ModelAdmin):
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "car":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
  

这使用HttpRequest实例来过滤Car   外键字段仅显示User实例拥有的汽车。

答案 1 :(得分:1)

我认为您要更改ModelChoiceField's queryset而不是formset的查询集。