首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBC视图的良好实践

VBC视图的良好实践
EN

Stack Overflow用户
提问于 2019-10-02 00:50:11
回答 1查看 51关注 0票数 0

我有一个关于基于阶级的观点的问题。

我有以下看法:

代码语言:javascript
复制
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模型的实例,这没有多大意义。

我的问题是,这样做好吗?

还有其他更好的方法来处理基于类的视图吗?

我想出的另一种更一致的方法是基于函数的视图,但这并不能让我信服:

代码语言:javascript
复制
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

代码语言:javascript
复制
# --- --- 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-02 01:18:59

我并不完全确定您的模型是如何设置的,但是当为特定模型创建视图集时,您将设置它类似于我下面所写的内容。课程将是模式,inscription_set将是相关的名称,如果课程是外键的铭文。现在,您可能已经在模型上自己设置了related_key名称,并可以将其切换出去。我猜铭文存储了一个user_id?我不知道你的模型经理在用.get_inscriptions做什么。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58193936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档