Вопрос по django-cms – Используя django-cms, как я могу позволить пользователю указать фоновое изображение

4

Я создаю сайт django-cms для клиента. Я хотел бы сделать что-то вроде:


Желаемый эффект должен иметь место, где пользователь CMS может выбрать фоновое изображение для страницы. В идеале они бы выбрали существующую картинку, используя что-то вроде.Filer

Есть ли способ сделать это?

Ваш Ответ

3   ответа
1

Отличный ответ Flimm, спасибо!

Я получаю ошибку, однако, в процессоре контекста, говорящем, чтоCMSPlugin объект не имеетfilerimage приписывать. Вот's контекстный процессор, который работает для меня:

# in context_processors.py
from cms.models.pluginmodel import CMSPlugin

def cover_image(request):
    page = request.current_page
    if page:
        cover_image_plugin = CMSPlugin.objects.filter(
            placeholder__page=page,
            placeholder__slot='cover_image',
            plugin_type='FilerImagePlugin',
        ).first()
        if cover_image_plugin:
            return {'cover': cover_image_plugin.get_plugin_instance()[0]}
    return {}

Обратите внимание на изменение в последней строке.get_plugin_instance извлекает правильно экземпляр класса объекта в качестве первой записи кортежа. (Я использую Django CMS 3.4)

В качестве последнего замечанияcover_image заполнитель должен находиться в месте, которое не отображается ».

Как последнее замечание, местозаполнитель cover_image должен находиться в месте, которое не отображается. " - где тогда это должно быть? Dmitriy Vinokurov
@DmitriyVinokurov E.g, положив его внутрь ... , Это позволяет избежать двойного рендеринга. Fabian
2

Пауло прав, первый шаг - настроить заполнитель так, чтобы он мог использовать только один плагин изображения, в этом случае,FileImagePlugin, Сделайте это, изменивCMS_PLACEHOLDER_CONF:

CMS_PLACEHOLDER_CONF = {
    'cover_image': {
        'plugins': ['FilerImagePlugin'],
        'name': _('Cover Image'),
        'limits': {'global': 1},
    },
}

Убедитесь, что в вашем шаблоне вы указываете этот заполнитель где-то:

{% load cms_tags %}
{% placeholder "cover_image" %}

Это сделает изображение в<img> тег. Но что, если вы хотите просто URL-адрес изображения? Тот'с каков второй шаг.

Создайте контекстный процессор, который даст вам изображение напрямую. Детали будут меняться в зависимости от того, какой плагин изображения выповторно, но это тот, который я использовал:

# in context_processors.py
from cms.models.pluginmodel import CMSPlugin

def page_extra(request):
    page = request.current_page
    if page:
        cover_image_plugin = CMSPlugin.objects.filter(
            placeholder__page=page,
            placeholder__slot='cover_image',
            plugin_type='FilerImagePlugin',
        ).first()
        if cover_image_plugin:
            return {'cover': cover_image_plugin.filerimage.image}
    return {}

Не забудьте установить контекстный процессор в вашемsettings.py файл:

TEMPLATES[0]['OPTIONS']['context_processors'].append('example.context_processors.page_extra')

Теперь в вашем шаблоне вы можете получить доступ к URL, используяcover.url, как это:


Где я должен разместить "{% заполнитель "cover_image» %}» тег? "cover.url | UrlEncode» пуст для меня. Dmitriy Vinokurov
0

Вы на правильном пути, как только этоКогда все, что вам нужно, это плагин, который в этом случае вы можете использовать filer. И чтобы сделать его лучше, вы можете использоватьCMS_PLACEHOLDER_CONF установка чтобы позволить только одному плагину быть заполнителем внутри заполнителя фонового изображения, вот так:

CMS_PLACEHOLDER_CONF = {
    'background-image': {
        "plugins": ('YourImagePlugin', ),
        'name':"Background Image",
        'limits': {
            'global': 1,
        },
    },
}
Тот'только половина решения. Другая половина, как вы получаете только URL изображения?{% placeholder backround-image %} окажет<img> тег, который здесь не тот, что нужен, просто URL. Flimm
Думаю, я неправильно понял вопрос :). Вместо подхода на основе плагинов, это 'Для этого лучше использовать расширение страницы. Paulo

Похожие вопросы