【问题标题】:Django: sorl-thumbnail and easy-thumbnail in same projectDjango:sorl-thumbnail 和 easy-thumbnail 在同一个项目中
【发布时间】:2011-12-31 17:27:10
【问题描述】:

我正在开发一个使用两个单独的模块化 Django 应用程序的项目。但是,一个应用程序需要简单的缩略图,而另一个需要 sorl-thumbnails。不幸的是,这两个缩略图库使用了模板标签语法 ​​{% load thumbnail %},因此当使用它们的模板尝试渲染时,它们会发生冲突和中断。

有没有办法解决这种类型的冲突? (例如,模板选项的效果是 {% load thumbnail as easy_thumbnail %})。我是否将不得不分叉其中一个应用程序并将其中一个缩略图库替换为另一个?如果是,我应该选择哪个?

感谢您考虑我的问题, 乔

【问题讨论】:

  • 这是一个非常简洁的模块,似乎可以解决这个问题。我想我看到了一张 django 票,可以为 django trunk 添加类似的功能。我希望它能成功。很高兴这个模块存在于当前和过去的 django 实例中。

标签: django image templates thumbnails sorl-thumbnail


【解决方案1】:

在 Django 1.9 中,您可以使用 DjangoTemplateslibraries 选项来包含指定名称下的标签库。在下面的示例中,sorl.thumbnail 的缩略图库包含在名称 sorl_thumbnail 下。

注意:模板标签本身不会在模板中更改... 即。仍然是thumbnail

用法:

settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "foo", "templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            'libraries': {
                'sorl_thumbnail': 'sorl.thumbnail.templatetags.thumbnail',
            },
        },
    },
]

your_template.html

{% load sorl_thumbnail %}
{% thumbnail mymodel.image "640x480" crop="center" as im %}
    <img src="{{ im.url }}" width="{{im.width}}" height="{{im.height}}"/>
{% endthumbnail %}

【讨论】:

  • 哇,这太棒了,而且是一个非常需要的功能!
  • 如果您有两个不同的第三方应用程序,并且都执行{% load thumbnail %},是否有解决方案?
【解决方案2】:

当然,只需编写您自己的存根 easy_thumbnail 包装器...

  1. 在您的一个 django 应用程序中创建一个 thumbnailtags 包...
  2. ...确保它有一个空的__init__.py
  3. thumbnailtags/easy_thumbnail.py 中执行以下操作:

    from django.template import Library
    from easy_thumbnails.templatetags import thumbnail
    
    register = Library()    
    
    def easy_thumbnail(parser, token):
        return thumbnail(parser, token)
    
    register.tag(easy_thumbnail)
    
  4. 使用{% load easy_thumbnail %}

注意:

您也可以将缩略图导入为 easy_thumbnail,并跳过 def easy_thumbnail 位,虽然我没有尝试过。

【讨论】:

    【解决方案3】:
    【解决方案4】:

    2015 年更新

    我必须对 Tom Christie 的回答进行以下修改才能使其正常工作:

    1. 在其中一个本地应用程序中创建一个templatetags 包。将其命名为 templatetags 很重要。模板标签见django docs
    2. ...确保它有一个__init__.py,无论是否为空。
    3. templatetags/easy_thumbnail.py 中这样做:

      from django.template import Library
      from easy_thumbnails.templatetags import thumbnail
      
      register = Library()    
      
      def easy_thumbnail(parser, token):
          return thumbnail.thumbnail(parser, token) # the important bit
      
      register.tag(easy_thumbnail)
      
    4. {% load easy_thumbnail %}- load easy_thumbnailpyjade 一起使用

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 2012-03-21
      • 2014-03-18
      • 2012-08-26
      • 2011-08-06
      • 2016-04-03
      • 2012-12-16
      • 2012-11-22
      • 2015-01-01
      相关资源
      最近更新 更多