Django ModelChoiceField在django.contrib.auth和Profile表中显示值

时间:2013-04-06 17:09:37

标签: python django django-models django-forms

我是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

的帐户/ utils.py中的代码
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。

有人可以帮帮我吗?我如何在下拉框中显示全名,并且一旦有人从下拉列表中选择并点击提交,仍然会将“用户”作为值传递?

感谢您的帮助:)

1 个答案:

答案 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
)