2016-06-24 3 views
2

У меня есть форма выбора, которая позволяет пользователю выбирать сотрудников с определенным диапазоном, назначенным им.Атрибут объекта доступа Django в форме выбора

class ReservationBookingForm(forms.Form): 
    employee = forms.ModelChoiceField(
     queryset = Employee.objects.none(), 
     #widget = forms.RadioSelect, 
     empty_label = None, 
     required = True, 
     label = '', 
     widget=forms.Select(attrs={'class':'input-lg text-center'}), 
     ) 
    def __init__(self, rangeId, *args, **kwargs): 
     super(ReservationBookingForm, self).__init__(*args, **kwargs) 
     self.fields['employee'].queryset = Employee.objects.filter(Q(range = rangeId) | Q(range = 'B')) 

Что я хочу сделать, это выбрать вариант выбора как Employee.first_name и Employee.last_name. Я действительно не хочу этого делать с помощью метода unicode.

Есть ли способ сделать это?

Что я получаю (без юникода) является:

option1 - Employee Object 
option2 - Employee Object 

Что я хочу:

option1 - John Doe 
option2 - Jack Doe 

, но я хочу, чтобы достичь этой цели без переопределения метода Юникода.

ответ

2

В конце ModelChoiceField секции:

__str__ (__unicode__ на Python 2) метод модели будет называться генерировать строковые представления объектов для использования в выборе месторождения; для предоставления индивидуальных представлений, подкласса ModelChoiceField и переопределения label_from_instance. Этот метод получит модельный объект и должен вернуть строку, подходящую для ее представления.

В вашем случае:

from django.forms import ModelChoiceField 

class MyModelChoiceField(ModelChoiceField): 
    def label_from_instance(self, obj): 
     return "{} {}".format(obj.first_name, obj.last_name) 

class ReservationBookingForm(forms.Form): 
    employee = MyModelChoiceField(...) 
    ... 
Смежные вопросы