2017-01-14 4 views
0

я создал эту модель Django:Дисплей auth.User поля в соответствующей модели

class Teacher(models.Model): 
    user = models.OneToOneField('auth.User', on_delete=models.CASCADE, default=1) 
    surname = models.CharField(max_length=15, null=True) 
    creation_date = models.DateTimeField('creation date', auto_now_add=True) 
    deletion_date = models.DateTimeField('deletion date', null=True, blank=True) 

и форму, чтобы представить его в режиме только для чтения:

class TeacherViewForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(TeacherViewForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.pk: 
      for field in self.fields: 
       self.fields[field].widget.attrs['disabled'] = True 

    class Meta: 
     model = Teacher 
     exclude = ['deletion_date'] 

мнение выглядит следующим образом:

class TeacherViewDetail(generic.DetailView): 
    model = Teacher 
    template_name = 'control/teacher_detail.html' 
    form_class = TeacherViewForm 

    def get_form(self): 
     # Instantiate the form 
     form = self.form_class(instance=self.object) 

     return form 

    def get_context_data(self, **kwargs): 
     context = super(TeacherViewDetail, self).get_context_data(**kwargs) 
     context.update({ 
      'form': self.get_form(), 
     }) 

     return context 

Как вы можете видеть, есть OneToOne соотношение между Teacher и auth.User моделей. Мне нужно показать first_name и last_name от auth.User модель, но показывается только username.

Как я могу отобразить эти поля так же, как показано на рисунке Teacher.surname? Должен ли я включать их в модель, поля form.fields или есть свойство, которое я должен изменить для его достижения?

Благодаря

ответ

0

Вы должны были бы удалить user поле и добавить соответствующие поля вместо. Тогда в вашей форме __init__, заполнить начальные значения:

# forms.py 
class TeacherViewForm(ModelForm): 
    first_name = forms.CharField() 
    last_name = forms.CharField() 

    def __init__(self, *args, **kwargs): 
     super(TeacherViewForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.pk: 
      for field in self.fields: 
       self.fields[field].widget.attrs['disabled'] = True 
      # set initial values 
      self.fields['first_name'].initial = instance.user.first_name 
      self.fields['last_name'].initial = instance.user.last_name 

    class Meta: 
     model = Teacher 
     exclude = ['user', 'deletion_date'] # exclude user 

Но почему вы используете форму вообще, если отключить все поля? Вы можете просто сделать эту информацию более свободно в шаблоне.

+0

Спасибо. Мне не нужна строка, подходящая для представления Пользователя, но для отображения полей auth.User (first_name и last_name) так же, как отображаются поля Учителя. – juankysmith

+0

Что вы подразумеваете под полями учителя? – schwobaseggl

+0

Поля учителя - это 'surname' и 'creation_date' ('deletion_date' исключен). В шаблоне я хочу видеть эти поля Учителя с «first_name» и «last_name» из модели auth.User – juankysmith