如何在 Django 中显示有关 M2M 字段的附加字段或覆盖 select2-results__option
How to display additional fields about the M2M field in Django or override select2-results__option
我希望实现一项功能,允许用户 select 其他用户并将他们添加到他们的多对多字段中。当前状态按照我想要的方式工作,但我希望能够显示有关他们正在 selecting 的用户的其他信息,而不仅仅是他们的用户名。诸如 first_name
、last_name
、个人资料信息等之类的内容 - 理想情况下,在将用户添加到他们的 m2m 队列时,它们会全部显示在一行中,例如:
John Smith | j.smith | j.smith@example.com
相对于:
j.smith
我看到元素 select2-results__option
,我很好奇是否可以用附加信息覆盖它。如果有一种干净的方法可以通过 django 做到这一点,我宁愿那样做,但真的对任何事情都开放。
Views.py
class UserAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.request.user.is_authenticated:
return User.objects.none()
qs = User.objects.all()
if self.q:
qs = qs.filter(Q(username__icontains=self.q) |
Q(first_name__icontains=self.q) |
Q(last_name__icontains=self.q))
return qs
forms.py
class UserSurveyQueueForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['queue'].queryset = User.objects.all().exclude(pk=user)
self.fields['queue'].required = False
class Meta:
model = UserSurveyQueue
fields = ('queue',)
widgets = {
'queue': autocomplete.ModelSelect2Multiple(
url='user-autocomplete',
),
}
假设这是针对 django-autocomplete-light,您可以覆盖 UserAutocomplete
class 的 get_result_label
方法来更改下拉列表中显示的文本。
def get_result_label(self, result):
return "{full_name}|{email}" .format(full_name = str(result), email = result.email)
如果你想让它漂亮 table,你将不得不深入研究 dal 的 javascript。
我希望实现一项功能,允许用户 select 其他用户并将他们添加到他们的多对多字段中。当前状态按照我想要的方式工作,但我希望能够显示有关他们正在 selecting 的用户的其他信息,而不仅仅是他们的用户名。诸如 first_name
、last_name
、个人资料信息等之类的内容 - 理想情况下,在将用户添加到他们的 m2m 队列时,它们会全部显示在一行中,例如:
John Smith | j.smith | j.smith@example.com
相对于:
j.smith
我看到元素 select2-results__option
,我很好奇是否可以用附加信息覆盖它。如果有一种干净的方法可以通过 django 做到这一点,我宁愿那样做,但真的对任何事情都开放。
Views.py
class UserAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.request.user.is_authenticated:
return User.objects.none()
qs = User.objects.all()
if self.q:
qs = qs.filter(Q(username__icontains=self.q) |
Q(first_name__icontains=self.q) |
Q(last_name__icontains=self.q))
return qs
forms.py
class UserSurveyQueueForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['queue'].queryset = User.objects.all().exclude(pk=user)
self.fields['queue'].required = False
class Meta:
model = UserSurveyQueue
fields = ('queue',)
widgets = {
'queue': autocomplete.ModelSelect2Multiple(
url='user-autocomplete',
),
}
假设这是针对 django-autocomplete-light,您可以覆盖 UserAutocomplete
class 的 get_result_label
方法来更改下拉列表中显示的文本。
def get_result_label(self, result):
return "{full_name}|{email}" .format(full_name = str(result), email = result.email)
如果你想让它漂亮 table,你将不得不深入研究 dal 的 javascript。