gpt4 book ai didi

python - Django:按用户过滤 ModelChoiceField

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:44 25 4
gpt4 key购买 nike

我有一个模型以及基于该模型的 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 提示未找到该请求。

最佳答案

可以通过request.user在 View 中形成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))

更新:在基于类的 View 中,您可以在 get_form_kwargs 中添加额外参数以形成初始化:

class TransUpdateView(UpdateView):
#...

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

关于python - Django:按用户过滤 ModelChoiceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21078471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com