Как отследить, какой пользователь создает объект для модели, и как показать детали объекта только этому пользователю в 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 theUsermodel [Django-doc] directly. For more information you can see the referencing theUsermodel section of the documentation.
Note: You can limit views to a view to authenticated users with the
@login_requireddecorator [Django-doc].
Примечание: Обычно
FormилиModelFormзаканчивается суффиксом…Form, чтобы избежать коллизии с именем модели, и чтобы было ясно, что мы работаем с формой. Поэтому, возможно, лучше использоватьCourseFormвместо.add_course
Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из
вcourseCourse.
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.