Python 如何在django表单中过滤查询集?
我正在尝试将聊天功能添加到我的应用程序中,现在我可以将用户添加到现有聊天中,但我需要做的是筛选尚未在表单中聊天的用户。 我使用带有传递参数的django表单来过滤我的用户,但没有得到任何结果。 我的聊天模式有一个m2m字段,称为“用户”,我的用户有一个m2m字段,称为“朋友” forms.pyPython 如何在django表单中过滤查询集?,python,django,django-forms,Python,Django,Django Forms,我正在尝试将聊天功能添加到我的应用程序中,现在我可以将用户添加到现有聊天中,但我需要做的是筛选尚未在表单中聊天的用户。 我使用带有传递参数的django表单来过滤我的用户,但没有得到任何结果。 我的聊天模式有一个m2m字段,称为“用户”,我的用户有一个m2m字段,称为“朋友” forms.py class AddUserToChatForm(forms.ModelForm): class Meta: model = Chat fields = ('use
class AddUserToChatForm(forms.ModelForm):
class Meta:
model = Chat
fields = ('users', )
def __init__(self, chat, friends, request, *args, **kwargs):
self.request = request
self.chat = chat
self.friends = friends
super(AddUserToChatForm, self).__init__(*args, **kwargs)
self.fields['users'] = forms.ModelMultipleChoiceField(queryset=self.request.user.friends.exclude(user__in=chat.users.all()),
widget=forms.CheckboxSelectMultiple
(attrs={'class': 'add-people-to-chat-form'}),
label='Friends:')
def add_users_to_chat(request, pk):
chat = Chat.objects.get(pk=pk)
friends = request.user.friends.all()
if request.method == 'POST':
form = AddUserToChatForm(chat, friends, request, request.POST)
if form.is_valid():
users_to_add = form.cleaned_data['users']
chat.users.add(*users_to_add)
chat.save()
return redirect('messages')
else:
form = AddUserToChatForm(chat, friends, request, instance=None)
return render(request, 'add_users_to_chat.html', {'form': form, 'chat': chat, 'friends': friends})
视图.py
class AddUserToChatForm(forms.ModelForm):
class Meta:
model = Chat
fields = ('users', )
def __init__(self, chat, friends, request, *args, **kwargs):
self.request = request
self.chat = chat
self.friends = friends
super(AddUserToChatForm, self).__init__(*args, **kwargs)
self.fields['users'] = forms.ModelMultipleChoiceField(queryset=self.request.user.friends.exclude(user__in=chat.users.all()),
widget=forms.CheckboxSelectMultiple
(attrs={'class': 'add-people-to-chat-form'}),
label='Friends:')
def add_users_to_chat(request, pk):
chat = Chat.objects.get(pk=pk)
friends = request.user.friends.all()
if request.method == 'POST':
form = AddUserToChatForm(chat, friends, request, request.POST)
if form.is_valid():
users_to_add = form.cleaned_data['users']
chat.users.add(*users_to_add)
chat.save()
return redirect('messages')
else:
form = AddUserToChatForm(chat, friends, request, instance=None)
return render(request, 'add_users_to_chat.html', {'form': form, 'chat': chat, 'friends': friends})
编辑
看起来我的exclude语句没有效果,因为当我将其切换为filter时,集合将返回所有用户朋友
更新
我能够使用如下差异方法检索所需的用户:
鉴于:
并将其传递给表单
def __init__(self, queryset, request, *args, **kwargs):
self.request = request
self.queryset = queryset
super(AddUserToChatForm, self).__init__(*args, **kwargs)
self.fields['users'] = forms.ModelMultipleChoiceField(queryset=self.queryset,
widget=forms.CheckboxSelectMultiple
(attrs={'class': 'add-people-to-chat-form'}),
label='Friends:')
使用difference方法获取用户,但现在当我尝试提交表单时,出现以下错误:不支持在difference()之后调用QuerySet.filter()。
调试器退出视图中此行的执行:
users_to_add = form.cleaned_data['users']
由于字段是由ModelForm自动生成的,因此最好只在init中定义查询集:
def __init__(self, chat, friends, request, *args, **kwargs):
self.request = request
self.chat = chat
self.friends = friends
super(AddUserToChatForm, self).__init__(*args, **kwargs)
self.fields['users'].queryset = self.request.user.friends.exclude(user__in=chat.users.all())
毕竟,通过使用exclude查询,我能够获得想要的结果: 鉴于:
queryset = friends.exclude(id__in=chat_users)
现在一切都按计划进行了