我有一个模特:
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')
但这不会产生预期的结果。这似乎是一个非常基本的问题,但寻找答案并没有发现太多。
答案 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())