Django ModelForm - 表单显示值

Django ModelForm - form display values

我有一个模型:

class SchedulerProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __unicode__(self):
        return u'%s' % (self.user)

我还有一个与调度程序有 M2M 关系的模型:

class OfficialProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    schedulers = models.ManyToManyField(SchedulerProfile, verbose_name="Your schedulers", related_name="off_schedulers") 

当我从 OfficialProfile 创建 ModelForm 时,该表单将调度程序多选内容呈现为用户名。我想让它在现场而不是用户中显示 user.first_name user.last_name。我知道我可以更改 unicode return 值来完成此操作,但出于某些原因我宁愿不这样做。在 ModelForm 的 __init__ 中,您应该能够执行如下操作:

self.fields['schedulers'].queryset = SchedulerProfile.objects.values('user__first_name', 'user__last_name')

但这并没有产生预期的结果。这似乎是一个非常基本的问题,但搜索答案并没有透露太多信息。

子类 ModelMultipleChoiceField 并覆盖 label_from_instance.

from django.forms import ModelMultipleChoiceField

class SchedulerProfileChoiceField(ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return "%s %s" % (obj.first_name, obj.last_name)

然后在模型表单中使用多项选择字段。

class OfficialProfileForm(forms.ModelForm):
    schedulers = SchedulerProfileChoiceField(queryset=SchedulerProfile.objects.all())