2015-05-26 4 views
0

У меня есть модель:Джанго 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 с планировщиком:

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

Когда я создаю ModelForm из OfficialProfile , форма отображает содержимое планировщика multiselect как имя пользователя. Я бы хотел, чтобы он отображал user.first_name user.last_name в поле вместо пользователя. Я знаю, что могу изменить возвращаемое значение unicode, чтобы выполнить это, но я бы предпочел не делать этого по причинам. В __init__ в ModelForm, вы должны быть в состоянии сделать что-то вроде:

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()) 
Смежные вопросы