首页 > 解决方案 > 如何为多个文件上传创建基于类的视图

问题描述

我正在上传多个文件,我想在 , 和 中使用类,models.py这样forms.pyviews.py的代码就可以在一个地方轻松更改并重用。

我遇到的问题是不了解如何为文件上传实现基于类的视图,该视图允许我创建实例以供重用。

我试图实现一个基于类的视图,如下所示,但我相信我需要插入一个init方法并插入self.属性,但我很困惑,因为属性中有诸如此类的功能reverse_lazy

我的观点.py

class FileUploadView(View):
    form_class = DocumentForm
    success_url = reverse_lazy('home') # want different url for every instance
    template_name = 'file_upload.html' # same for template_name

    def get(self, request, *args, **kwargs):
        form = self.form_class()
        return render(request, self.template_name, {'form': form})

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect(self.success_url)
        else:
            return render(request, self.template_name, {'form': form})

编辑:正如 Gasanov 所建议的,您可以将success_urlandtemplate_name作为参数插入url_patterns如下:

urlpatterns = [    
path('stylist/', payroll_views.FileUploadView.as_view(
        success_url=reverse_lazy('landing.html'), template_name='stylist.html'), name='stylist'),
]

这允许以干净实用的方式重用基于类的视图。

标签: pythondjangodjango-views

解决方案


看起来你可以从使用FormView而不是受益View,因为你基本上是post从那里重新实现。

为了“覆盖” success_urland template_name,已经有一些方法可以做到这一点:


class FileUploadView(FormView):
    ...
    def get_success_url(self):
        if blahblah:
            return something
        else:
            return something_else

    def get_template_names(self):
        if blahblah:
            return ['some/template.html']
        else:
            return ['another/template.html']

推荐阅读