Django:按用户过滤 ModelChoiceField

Posted

技术标签:

【中文标题】Django:按用户过滤 ModelChoiceField【英文标题】:Django: Filter ModelChoiceField by user 【发布时间】:2014-01-31 10:36:50 【问题描述】:

我有一个模型以及一个基于该模型的 ModelForm。 ModelForm 包含一个 ModelMultipleChoice 字段,我在 ModelForm 的子类中指定:

class TransactionForm(ModelForm):

    class Meta:
        model = Transaction

    def __init__(self, *args, **kwargs):
        super(TransactionForm, self).__init__(*args, **kwargs)
        self.fields['category'] = forms.ModelChoiceField(queryset=Category.objects.filter(user=user))

如您所见,我需要按用户过滤类别查询集。换句话说,用户应该只在下拉菜单中看到他们自己的类别。但是当用户,或者更具体地说,request.user 在模型实例中不可用时,我该怎么做呢?

编辑:添加我的 CBV 子类:

class TransUpdateView(UpdateView):
    form_class = TransactionForm
    model = Transaction
    template_name = 'trans_form.html'
    success_url='/view_trans/'

    def get_context_data(self, **kwargs):
        context = super(TransUpdateView, self).get_context_data(**kwargs)
        context['action'] = 'update'
        return context

我尝试了form_class = TransactionForm(user=request.user),但收到一个 NameError 提示未找到该请求。

【问题讨论】:

【参考方案1】:

您可以通过request.user在视图中形成init:

def some_view(request):
     form = TransactionForm(user=request.user)

并添加user 参数以形成__init__ 方法(或从kwargs 中弹出它):

class TransactionForm(ModelForm):
    class Meta:
        model = Transaction

    # def __init__(self, *args, **kwargs):
        # user = kwargs.pop('user', User.objects.get(pk_of_default_user))
    def __init__(self, user, *args, **kwargs):
        super(TransactionForm, self).__init__(*args, **kwargs)
        self.fields['category'] = forms.ModelChoiceField(
                                     queryset=Category.objects.filter(user=user))

更新:在基于类的视图中,您可以在 get_form_kwargs 中添加额外的参数来形成 init:

class TransUpdateView(UpdateView):
    #...

    def get_form_kwargs(self):
        kwargs = super(YourView, self).get_form_kwargs()
        kwargs.update('user': self.request.user)
        return kwargs

【讨论】:

谢谢,模型中的解决方案很有意义。现在的问题是,我将如何使用基于类的通用视图来做到这一点? 好的,我添加了,现在我得到cannot convert dictionary update sequence element #0 to a sequence 是的,在添加您所拥有的内容时,当然要将 super 调用更改为我自己的类名。顺便说一句,我正在使用 Django 1.5。当我尝试self.request.user[0] 缩小问题范围时,我得到SimpleLazyObject does not support indexing @trpt4him 抱歉,我的错误在这里:'user', self.request.user,应该是 'user': self.request.user @Ptar ***.com/questions/5827590/css-styling-in-django-forms

以上是关于Django:按用户过滤 ModelChoiceField的主要内容,如果未能解决你的问题,请参考以下文章

Django - 按用户过滤

Django按用户组过滤外键关系

如何在 django 中按日期范围过滤记录?

按用户角色和 id 过滤的 Django 自定义权限

在 Django admin 中,如何按组过滤用户?

Django 仅使用 Sqlite 按距离过滤(无 GeoDjango、PostGres、MySQL、GIS)