django模型形式过滤查询集

时间:2012-11-24 07:44:57

标签: django django-models django-forms

我有以下型号:

class Article(models.Model):

   title = models.CharField()
   description = models.TextField()
   author = models.ForeignKey(User)


class Rating(models.Model):

    value = models.IntegerField(choices=RATING_CHOICES)
    additional_note = models.TextField(null=True, blank=True)
    from_user = models.ForeignKey(User, related_name='from_user')
    to_user = models.ForeignKey(User, related_name='to_user')
    rated_article = models.ForeignKey(Article, null=True, blank=True)
    dtobject = models.DateTimeField(auto_now_add=True)

基于上述模型,我创建了一个模型表单,如下所示:

模型表格:

class RatingForm(ModelForm):

     class Meta:
          model = Rating
          exclude = ('from_user', 'dtobject')

排除from_user,因为request.userfrom_user

表单呈现得很好,但在下拉字段的to_user中,作者也可以评价自己。所以我希望current_user的名字填充在下拉字段中。我该怎么做?

1 个答案:

答案 0 :(得分:8)

覆盖__init__以从to_user选项中删除当前用户。

更新:更多解释

ForeignKey使用ModelChoiceField,其选择是queryset。因此,在__init__中,您必须从to_user的查询集中删除当前用户。

更新2:示例

class RatingForm(ModelForm):
    def __init__(self, current_user, *args, **kwargs):
        super(RatingForm, self).__init__(*args, **kwargs)
        self.fields['to_user'].queryset = self.fields['to_user'].queryset.exclude(id=current_user.id)

    class Meta:
        model = Rating
        exclude = ('from_user', 'dtobject')

现在,您可以在视图中创建RatingForm对象传递request.user作为关键字参数current_user,如下所示。

form = RatingForm(current_user=request.user)