Python 如何在Django中使用基于类的视图从models.py调用函数?

Python 如何在Django中使用基于类的视图从models.py调用函数?,python,django,python-3.x,django-class-based-views,Python,Django,Python 3.x,Django Class Based Views,我想使用models.py中的函数/方法将用户上传的.docx文件转换为.html。我可以通过这种方法使用基于函数的视图来实现这一点: models.py: class Article(models.Model): main_file = models.FileField(upload_to="files") slug = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) @cl

我想使用models.py中的函数/方法将用户上传的.docx文件转换为.html。我可以通过这种方法使用基于函数的视图来实现这一点:

models.py:

class Article(models.Model):
    main_file = models.FileField(upload_to="files")
    slug = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    @classmethod
    def convert_word(self, slug):
        import pypandoc
        pypandoc.convert_file('media/files/%s.docx' %slug, 'html', outputfile="media/files/%s.html" %slug)
然后我在views.py中调用convert_word函数,如下所示:

def submission_conf_view(request, slug):
    Article.convert_word(slug)
    return redirect('submission:article_list')

我想做的是调用相同的函数/方法,但使用Django的基于类的视图,但我很难弄清楚这一点。

您可以使用base
视图
并重写
get
方法

from django.views import View

class MyView(view):
    def get(self, request, *args, **kwargs):
        Article.convert_word(self.kwargs['slug'])
        return redirect('submission:article_list')
或者,由于视图总是重定向,您可以使用
重定向视图

class MyView(RedirectView):

    permanent = False
    pattern_name = 'submission:article_list'  # the pattern to redirect to

    def get_redirect_url(self, *args, **kwargs):
        # call the model method
        Article.convert_word(self.kwargs['slug'])
        # call super() to return a redirect
        return super().get_redirect_url(*args, **kwargs)
然而,使用这两种方法都没有真正的优势。我认为您当前的三行方法更具可读性

有关更多信息,请参阅关于或的文档