如何为多个文件上传创建基于类的视图

时间:2019-05-17 18:55:20

标签: python django django-views

我正在上传多个文件,我想使用models.pyforms.py以及views.py中的类,以便我可以轻松地在一个地方更改代码并重复使用。

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

我尝试实现如下所示的基于类的视图,但是我认为我需要插入 init 方法并在属性上插入self.,但我感到困惑属性中有诸如reverse_lazy之类的功能。

我的views.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_url中插入template_nameurl_patterns作为参数:

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

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

2 个答案:

答案 0 :(得分:0)

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

为了“覆盖” success_urltemplate_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']

答案 1 :(得分:0)

我不确定您要在哪里声明不同的success_urltemplate_name,但是您可以像这样在urls.py中进行声明:

urlpatterns = [
    path('a/', FileUploadView.as_view(success_url=reverse_lazy('home'), template_name='index1.html')),
    path('b/', FileUploadView.as_view(success_url=reverse_lazy('nothome'), template_name='index2.html'))
]