django模型形式过滤查询集

wha*_*atf 3 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)
Run Code Online (Sandbox Code Playgroud)

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

型号表格:

class RatingForm(ModelForm):

     class Meta:
          model = Rating
          exclude = ('from_user', 'dtobject')
Run Code Online (Sandbox Code Playgroud)

排除from_user因为request.userfrom_user.

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

Rag*_*gar 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')
Run Code Online (Sandbox Code Playgroud)

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

form = RatingForm(current_user=request.user)
Run Code Online (Sandbox Code Playgroud)