【问题标题】:Django : how to include a view.py file inside a view from another app?Django:如何在另一个应用程序的视图中包含 view.py 文件?
【发布时间】:2016-05-02 15:16:30
【问题描述】:

我制作了一个“分页器”应用程序,为我的所有页面添加了此类 SEO 优化。 所以我需要通过 paginator.view 传递所有可见的页面 url 但是,我希望我的应用程序尽可能结构化。

例如,这里是我的画廊应用程序的视图:

gallery.views

from django.shortcuts import render
from gallery.models import GalleryItem

def home(request):
    img_to_display = GalleryItem.objects.filter(published=True
                    ).order_by('-date')
    return render(request, 'gallery/all.html', locals())
...

现在我在分页器中的视图中这样做:

我当前的 paginator.views

from django.shortcuts import render, get_object_or_404, redirect

from gallery.models import GalleryItem
from paginator.models import Page

import gallery


def custom_page(request, url):
    current_page = url

    # just for the gallery page :
    if url == 'gallery':
        img_to_display = GalleryItem.objects.filter(published=True
                            ).order_by('-date')
   
    # for all my page
    page_to_load = get_object_or_404(Page, name=url)
    template_to_load = "paginator/" + page_to_load.template_name
    
    return render(request, template_to_load, locals())

所以我复制/粘贴了我的视图和所有依赖项,但这真的很难看,而且根本不是 DRY,值得它不可维护。我尝试了类似的方法,但它不起作用:

paginator.views : option1

from django.shortcuts import render

import gallery


def custom_page(request, url):
    if url == 'gallery':
        gallery.views.home(request)
    if url == 'anotherpage':
        anotherapp.views.home(request)
...

或者类似的东西:

paginator.views : 选项 2

from django.shortcuts import render

def custom_page(request, url):
    if url == 'gallery':
        include("gallery.views.py")
    if url == 'anotherpage':
        include("anotherapp.views.py")
...

注意:我更喜欢最后一个样式选项,因为它会在 paginator.views 文件的开头最小化导入。

非常感谢您的帮助! :)

【问题讨论】:

  • 你想从paginator.custom_page触发gallery.home视图吗?
  • 是的,在某些方面,在选项 1 中。但即使我将所有“来自 ... 导入 ...”从我的 gallery.views 包含到我的分页器中,它也不起作用。视图:gallery.views.home(请求)。有没有办法使选项2有效?也许通过指定一个参数,比如: include("gallery.views.py", home()) ?
  • 你在尝试重定向之类的东西吗?从custom_pagegallery.home 你需要什么?
  • 我所有的页面都有:名称、seo_title、seo_decription(等等)以及 txt_content 和模板链接...
  • 我还不明白custom_page 视图有什么帮助。如果需要,您可以使用 template_processor 将变量传递给每个模板。

标签: django django-views


【解决方案1】:

如果您需要在请求被分派到视图之前执行的机制,我建议使用中间件类。您可以在 Django docs 中阅读有关它的更多信息。

另一种选择是使用基于类的视图来创建一个 SEOView,它可以被您的每个自定义页面视图继承。它看起来如何的一些示例:

from django.views.generic.base import View

class MySeoView(View):
  def dispatch(self, request, *args, **kwargs):
    # some logic for SEO 
    return super().dispatch(request, *args, **kwargs)


class CustomView1(MySeoView):
  def get(self, request, *args, **kwargs):
    # do normal stuff for this page
    return HttpResponse(...)

  def post(self, request, *args, **kwargs):
    # maybe some other logic for posts
    return HttpResponse(...)

回到你自己的选择:

如果你想让#1 工作,我猜你必须返回视图的结果:

...
if url == 'someUrl':
  return gallery.views.home(request)
...

【讨论】:

    【解决方案2】:

    首先,我要感谢 Gocht 让我走上了一条好路。这就是我所做的:

    分页器.views

    def custom_page(request, url):
        """
        Vue d'une page statique.
        """
    
        if url == 'gallery':
            import gallery
            gal = gallery.views.render_gallery(request)
            gal.render()
            gallery_html = gal.rendered_content
    
        if url == 'xxx':
            ...
    
        page_to_load = get_object_or_404(Page, url=url)
        template_to_load = "paginator/" + page_to_load.template_name
        return render(request, template_to_load, locals())
    

    gallery.views

    from django.template.response import TemplateResponse
    
    from gallery.models import GalleryItem
    
    def render_gallery(request):
        img_to_display = GalleryItem.objects.filter(published=True
                            ).order_by('-date')
        return TemplateResponse(request, 'gallery/gallery.html', locals())
    

    但是,是的,现在,我知道像 simP 这样的东西会更干净。谢谢!

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2017-01-20
      • 2010-11-10
      • 2020-09-06
      • 1970-01-01
      • 2011-06-02
      相关资源
      最近更新 更多