Display auth.Поля пользователя в связанной модели

Я создал эту модель Django:

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, как отображается поле?
Нужно ли включать их в модель, форму.поля или есть свойство, которое я должен изменить для его достижения?

Спасибо

1 ответ

  1. Вместо этого необходимо удалить 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
    

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