У меня есть вопрос об основанных на классе представлениях.
У меня есть следующее представление:
class UserCourseListView(ListView):
model = User
template_name = 'courses/user_course_list.html'
def get_queryset(self):
user_inscriptions = self.request.user.get_inscriptions.all()
courses = [inscription.course for inscription in user_inscriptions]
return courses
Цель представления - получить список курсов, в которыхПользователь, который вошел в систему в то время, зарегистрировался. И иметь возможность доступа к этим данным в контексте (в шаблоне).
У меня есть следующие сомнения:
Атрибут класса model
является моделью User
и в методе get_queryset
estoy, возвращающем экземпляры модели Course
, что не имеет особого смысла.
И мой вопрос заключается в том, является ли это хорошей практикой?
Есть ли другой лучший способ сделать это с помощью представлений на основе классов?
Другой способ, которым я придумал это, и он более согласуется с представлением на основе функций, но это меня не особо убеждает:
def user_course_list(request):
user_inscriptions = request.user.get_inscriptions.all()
courses = [inscription.course for inscription in user_inscriptions]
return render('courses/user_course_list.html', {'courses': courses})
Поскольку документация Django рекомендует максимально использовать представления на основе классов.
ОБНОВЛЕНИЕ:
Мой файл models.py
:
# --- --- COURSE MODEL --- ---
class Course(models.Model):
STATUS = [('unpublish', 'No publicar'),('published', 'Publicar')]
title = models.CharField(max_length = 60)
subtitle = models.CharField(max_length = 120)
price = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0)
image = models.ImageField(upload_to = manage_courses_media_files)
description = models.TextField()
status = models.CharField(max_length = 60, choices = STATUS, default = 'unpublish')
instructor = models.ForeignKey(Instructor, on_delete = models.CASCADE, related_name = 'get_courses')
slug = models.SlugField(max_length = 60)
created = models.DateTimeField(auto_now_add = True)
updated = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['-created', '-updated']
def __str__(self):
return self.title
# --- --- INSCRIPTION MODEL --- ---
class Inscription(models.Model):
course = models.ForeignKey(Course, on_delete = models.CASCADE, verbose_name = 'Curso')
user = models.ForeignKey(User, on_delete = models.CASCADE, verbose_name = 'Usuario', related_name = 'get_inscriptions')
created = models.DateTimeField(auto_now_add = True, verbose_name = 'Fecha de inscripcion')
class Meta:
verbose_name = 'inscripcion'
verbose_name_plural = 'inscripciones'
def __str__(self):
return self.course.title