Как создать представление на основе классов для нескольких загрузок файлов - PullRequest
0 голосов
/ 17 мая 2019

Я загружаю несколько файлов, и я хотел бы использовать классы в 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})

РЕДАКТИРОВАТЬ: Как предложил Гасанов, вы можете вставить 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'),
]

Это позволяет повторно использовать представление на основе классов простым и прагматичным способом.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Я не уверен, где вы хотите объявить разные 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'))
]
0 голосов
/ 17 мая 2019

Похоже, что вы могли бы выиграть от использования 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']
...