Назначить значение внешнего ключа после создания (вошедший в систему пользователь) - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть createview с использованием CBV

class StudentCreate(LoginRequiredMixin, CreateView):

    login_url = '/signin/'
    model = Student
    fields = ['first_name', 'last_name' ]
    success_url = '/dashboard/'

Соответствующие модели.py

class Class_teacher(models.Model):

    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    standard = models.IntegerField()
    division = models.CharField(max_length=1)
    subject = models.CharField(max_length=200)
    email = models.CharField(max_length=30)


class Student(models.Model):

    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)
    classteacher = models.ForeignKey('Class_teacher', on_delete=models.SET_NULL,blank=True, null=True )

В веб-приложении есть функция входа в систему.Когда пользователь (classteacher) авторизуется, он может добавлять учеников.То, что я хочу, это то, чтобы поле classteacher в Student (форма модели) было автоматически установлено как пользователь, который является classteacher.(Classteacher) и должен быть сохранен в БД после создания ученика.Модель Classteacher обновлена ​​соответствующими полями.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вам нужно определить свой собственный form_valid().Я полагаю, что Учитель имеет отношение один к одному с вашей моделью пользователя.

def form_valid(self, form):
    student = form.save(commit=False)
    #retrieve the current logged_in teacher, of course you have to be sure this view is only accesible for teachers (in dispatch for exemple)
    self.object.classteacher = self.request.user.teacher
    self.object.save()
    return super(StudentCreate, self).form_vaild(form)

#bonus the dispatch
def dispatch(self, request, *args, **kwargs):
        #get the loged in user
        if request.user.teacher:
            return super(StudentCreate, self).dispatch(request, *args, **kwargs)
        else:
            raise Http404
1 голос
/ 29 апреля 2019

Посмотрите здесь для различных методов CreateView, которые вы можете переопределить.

В вашем случае вы хотите переопределить метод form_valid(), который вызывается при сохранении нового Student.

from django.shortcuts import get_object_or_404

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.classteacher = get_object_or_404(Class_teacher, email=self.request.user.email)
    self.object.save()
    return super().form_valid(form)
...