我正在上传多个文件,我想使用models.py
,forms.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_name
和url_patterns
作为参数:
urlpatterns = [
path('stylist/', payroll_views.FileUploadView.as_view(
success_url=reverse_lazy('landing.html'), template_name='stylist.html'), name='stylist'),
]
这允许以干净实用的方式重用基于类的视图。
答案 0 :(得分:0)
看起来您可以从使用FormView
而不是View
中受益,因为您基本上是从那里重新实现post
。
为了“覆盖” success_url
和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']
答案 1 :(得分:0)
我不确定您要在哪里声明不同的success_url
或template_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'))
]