хорошая практика взглядов VBC - PullRequest
0 голосов
/ 02 октября 2019

У меня есть вопрос об основанных на классе представлениях.

У меня есть следующее представление:

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

1 Ответ

0 голосов
/ 02 октября 2019

Я не совсем уверен, как настроены ваши модели, но при создании набора для конкретной модели вы бы настроили его так, как я написал ниже. Курс будет моделью, inscription_set будет связанным именем, если курс является внешним ключом в надписи. Теперь вы, возможно, сами задали имя related_key для модели и могли бы это отключить. Я предполагаю, что надписи хранят user_id? Я не уверен, что ваш менеджер моделей делает с .get_inscriptions.

class UserCourseListView(ListView):
    model = Course
    queryset = Course.objects.all()
    template_name = 'courses/user_course_list.html'

    def get_queryset(self):
        courses = self.queryset.filter(inscription_set__get_inscriptions=request.user)
        return courses.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...