Django ModelForm - 表单显示值

时间:2015-05-26 17:08:19

标签: django django-forms

我有一个模特:

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时,表单将调度程序multiselect的内容呈现为用户名。我想让它在字段而不是用户中显示user.first_name user.last_name。我知道我可以改变unicode返回值来实现这一目标,但我宁愿不这样做是出于原因。在ModelForm的__init__中,您应该可以执行以下操作:

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

但这不会产生预期的结果。这似乎是一个非常基本的问题,但寻找答案并没有发现太多。

1 个答案:

答案 0 :(得分:2)

子类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())