【问题标题】:good practices of VBC viewsVBC 视图的良好做法
【发布时间】:2019-10-02 00:50:11
【问题描述】:

我对基于类的视图有疑问。

我有以下看法:

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

【问题讨论】:

    标签: python django django-views


    【解决方案1】:

    我不完全确定您的模型是如何设置的,但是在为特定模型制作视图集时,您会像我在下面写的那样设置它。 Course 将是模型,inscription_set 将是相关名称,如果 course 是题字上的外键。现在您可能已经在模型上自己设置了 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()
    

    【讨论】:

    • 我收到一个错误,但我认为您即将解决我的问题,我已经更新了显示我的模型的问题
    • 根据您的修改将相关名称从 user 更改为 get_inscriptions,如果可行,请告诉我。
    • Cannot resolve keyword 'inscription_set' into field. Choices are: cart, created, description, get_sections, id, image, inscription, instructor, instructor_id, price, slug, status, subtitle, title, updated
    • 哦,那就改成题字吧,那一定是related_name
    • 我不懂你,给我解释清楚
    猜你喜欢
    • 2016-04-29
    • 2020-07-26
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多