Как отследить, какой пользователь создает объект для модели, и как показать детали объекта только этому пользователю в django

Я делаю проект онлайн класса на Django, где я создал модель под названием create_course, которая доступна учителям. Теперь я пытаюсь разработать модель так, чтобы учитель, который создает класс, мог видеть только его, после входа в систему другой учитель не должен видеть его классы и как добавить учеников в этот конкретный класс, который я создал

модель курса

class course(models.Model):
    course_name = models.CharField(max_length=200)
    course_id = models.CharField(max_length=10)
    course_sec = models.IntegerField()
    classroom_id = models.CharField(max_length=50,unique=True)
    created_by = models.ForeignKey(User,on_delete=models.CASCADE)

где если я использую поле "the created_by" в формах, то это выглядит как выпадающее меню, в котором отображается каждый пользователь, но я хочу автоматически сохранить пользователя, который создает объект

views.py

def teacher_view(request, *args, **kwargs):
    form = add_course(request.POST or None)
    context = {}
    if form.is_valid():
        form.save()
        return HttpResponse("Class Created Sucessfully")
    context['add_courses'] = form
    return render(request, 'teacherview.html', context)

forms.py

from django import forms
from .models import course

class add_course(forms.ModelForm):
    class Meta:
        model = course
        fields = ('course_name', 'course_id', 'course_sec', 'classroom_id')

В вашем представлении используйте commit=False, чтобы остановить сохранение формы, пока вы не добавите поле created_by.

def teacher_view(request, *args, **kwargs):
    form = add_course(request.POST or None)
    context = {}
    if form.is_valid():
        course = form.save(commit=False)
        course.created_by = request.user
        course.save()
        return HttpResponse("Class Created Sucessfully")
    context['add_courses'] = form
    return render(request, 'teacherview.html', context)

Вы можете ввести вошедшего пользователя в .created_by из .instance в form, так:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def teacher_view(request, *args, **kwargs):
    if request.method == 'POST':
        form = add_course(request.POST, request.FILES)
        if form.is_valid():
            form.instance.created_by = request.user
            form.save()
            return redirect('name-of-some-view')
    else:
        form = add_course()
    return render(request, 'teacherview.html', {'add_courses': form})

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].


Примечание: Обычно Form или ModelForm заканчивается суффиксом …Form, чтобы избежать коллизии с именем модели, и чтобы было ясно, что мы работаем с формой. Поэтому, возможно, лучше использовать CourseForm вместо add_course.


Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из course в Course.


Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

Вернуться на верх