【问题标题】:How to get the data from views to template Django如何从视图中获取数据到模板 Django
【发布时间】:2021-08-12 04:55:21
【问题描述】:

我正在从我的模型上传一个文件,在我的视图中我对文件执行一些操作。我正在使用 Django 的 CBV 的 DetailView,我在其中获取一个对象并对其执行一些操作。现在我想要模板中的数据(在执行操作之后)。我知道如何在我的模板中显示该文件,因为该文件位于 models 中。但是这些功能不在模型中,我想在我的模板中打印它们。 我的 models.py 是:

class FileUpload(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, blank=True , null=True)
    file = models.FileField(upload_to='files')




    def get_absolute_url(self):
        return reverse('home')

我的 views.py 是:

class PostDetailView(DetailView):
    context_object_name = "object_list"
    template_name = "post_detail.html"


    def get_object(self, *args,**kwargs):
        request = self.request
        pk = self.kwargs.get('pk')
        instance = FileUpload.objects.get(id = pk) #I want to print this  instance

        if instance is None:
            raise Http404("File Does not EXIST")
        else:
            pdfFileObj = open(instance.file.path, 'rb')
            pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
            print('number of pages = ',pdfReader.numPages)
            pageObj = pdfReader.getPage(0)
            print(pageObj.extractText())     #I want to print this
            query = pageObj.extractText()

            for j in search(query, tld="co.in", num=10, stop=10, pause=2):
                print(j)       #I want to print this

            pdfFileObj.close()
        return instance

【问题讨论】:

  • 你可以把所有的东西移到get_context_data,这样你就可以把你想打印的东西传递给模板
  • 先生怎么样? .我不知道

标签: python django django-models django-views django-templates


【解决方案1】:

尝试首先将查询集添加为FileUpload.objects.all(),以便您的详细视图自动知道在哪里找到您的对象。这样,您就不必编写自己的get_object

然后,您可以将所有这些处理移动到get_context_data,然后如果您想显示它们,则将它们传递给模板,如下所示:

class PostDetailView(DetailView):
    context_object_name = "object_list"
    template_name = "post_detail.html"
    queryset = FileUpload.objects.all()

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)

        pdfFileObj = open(self.object.file.path, 'rb')
        pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
        print('number of pages = ',pdfReader.numPages)
        pageObj = pdfReader.getPage(0)
        extracted_text = pageObj.extractText())
        query = pageObj.extractText()

        search_results = []
        for j in search(query, tld="co.in", num=10, stop=10, pause=2):
            search_results.append(j)

        pdfFileObj.close()

        context['extracted_text'] = extracted_text
        context['search_results'] = search_results

        return context

然后您应该能够在模板中使用它们:

{{ extracted_text }}

{{ search_results }}

要打印实例,只需使用:

{{ object }}

【讨论】:

  • 你能解释一下get_object和get _context_data有什么区别
  • get_object 顾名思义,只是获取详细视图将处理的对象。 get_context_data 负责收集可以在您的模板中使用的所有上下文/对象。因此,如果您想在模板中使用某些内容,则需要使用 get_context_data 并将其添加到 context
猜你喜欢
  • 2018-08-30
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2019-09-23
  • 1970-01-01
  • 2013-01-21
  • 2020-03-19
相关资源
最近更新 更多