2015-05-26 38 views
0

我有一個模型:的Django的ModelForm - 形式顯示值

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關係的模型:當我創建從OfficialProfile一個的ModelForm

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") 

,表單會將調度程序的內容多重選擇爲用戶名。我想讓它在現場顯示user.first_name user.last_name而不是用戶。我知道我可以改變unicode的返回值來完成這個任務,但我寧願不這樣做。在的ModelForm的__init__,你應該能夠做這樣的事情:

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

但是,這並不產生預期的結果。這似乎是一個非常基本的問題,但尋找答案並沒有透露太多。

回答

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