我是python或django的新手。我继承了一些需要“修复”的代码,我可以使用一些帮助。
情况如下:
我们有一个下拉框,您可以从中选择多个用户。目前,用户显示为用户名。我们希望它们以全名显示。
问题:
用户名来自:django.contrib.auth
名字和姓氏来自个人资料模型。 以下是Profile Model的样子:
class Profile(models.Model):
CURRENTLY_STUDENT = "STU"
CURRENTLY_PROFESSOR = "PFR"
CURRENTLY_CHOICES = [
(CURRENTLY_STUDENT, "Student"),
(CURRENTLY_PROFESSOR, "Professor"),
]
user = models.OneToOneField(User, related_name="profile")
currently_am = models.CharField(max_length=3, choices=CURRENTLY_CHOICES, default=CURRENTLY_STUDENT)
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
如果您必须显示全名,我们使用以下内容:
user.profile.display_name
其中display_name为:
def display_name(self):
name = "%s %s" % (self.first_name, self.last_name)
return name
以下是forms.py:
中下拉框的代码 from django import forms
from django.contrib.auth.models import User
from account.utils import user_display
class UserMultipleChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return user_display(obj)
class ShareForm(forms.Form):
participants = UserMultipleChoiceField(
queryset=User.objects.none(),
label="",
widget=forms.SelectMultiple(
attrs={
"data-placeholder": "Choose members.. "
}
)
)
以下是user_display
from account.conf import settings
def user_display(user):
return settings.ACCOUNT_USER_DISPLAY(user)
这是来自account / conf.py
的代码class AccountAppConf(AppConf):
USER_DISPLAY = lambda user: user.username
您不能使用obj.get_full_name()
作为名字和姓氏不是来自django.contrib.auth,而是存储在上面提到的个人资料模型中。
您不能使用return obj.profile.display_name(),因为在Django.contrib.auth上绘制了ModelChoiceField。
有人可以帮帮我吗?我如何在下拉框中显示全名,并且一旦有人从下拉列表中选择并点击提交,仍然会将“用户”作为值传递?
感谢您的帮助:)
答案 0 :(得分:1)
您可以将自定义选项指定为:
choices = [(obj.id, obj.profile.display_name()) for obj in User.objects.all()]
participants = UserMultipleChoiceField(
queryset=User.objects.none(),
label="",
widget=forms.SelectMultiple(
attrs={
"data-placeholder": "Choose members.. "
}
),
choices=choices
)