如何在Django-CMS中更新上下文

wixjitnu  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(120)

我尝试在我的apphook的上下文中添加我的ListView的应用程序的查询集,但我无法获得查询集。我已经创建了两个模型我的ServicePLuginModelService模型。

class ServicePluginModel(CMSPlugin):

    title = models.CharField(_('title'),
        blank=True,
        help_text='Service Widget',
        max_length=64,
    )
class Service(CMSPlugin):
    # Attributes - Mandatory
    title = models.CharField(_('title'),
                    max_length=200, 
                    blank=False)

我创建了一个ListView

class ServiceListView(ListView):
    model = Service
    queryset = Service.objects.all()
    def get_context_data(self, **kwargs):
        context = super(ServiceListView).get_context_data(**kwargs)
        queryset = Service.objects.all()
        context["now"] = timezone.now()
        context.update({'object_list': queryset})
        context.update(kwargs)
        return super().get_context_data(**context)

        
    def render_to_response(self, context, **response_kwargs):
        # Shim to affect the CMS Toolbar only
        if self.request.toolbar and self.request.toolbar.edit_mode:
            menu = self.request.toolbar.get_or_create_menu('service-list-menu', 'Services')
            menu.add_break()

        return super(ServiceListView, self).render_to_response(context, **response_kwargs)

urls.py

app_name = 'services'
urlpatterns = [
    re_path('/', ServiceListView.as_view(), name='service-list'),
    re_path(r'^(?P<slug>[\w-]+)/?$', ServiceDetailView.as_view(), name='service_detail'),
]

我的cms_plugins.py

@plugin_pool.register_plugin  # register the plugin
class ServicePluginPublisher(CMSPluginBase):
    model = ServicePluginModel # model where plugin data are saved
    module = _("Services")
    name = _("Service Plugin")  # name of the plugin in the interface
    cache = False
    render_template = "services/service_list.html"

    def render(self, context, instance, placeholder):
        context.update({'instance': instance })
        return context

cms_apps.py

@apphook_pool.register  # register the application
class Servicesapphook(CMSApp):
    app_name = "services"
    name = "Services Application"

    def get_urls(self, page=None, language=None, **kwargs):
        return ["eldemmedya.apps.services.urls"]

我的service_list.html:

{% for service in object_list %}
  <li>
    <div class="cs_image_box cs_style_1">
      <div class="cs_image_box_number cs_primary_color cs_primary_font cs_fs_38 cs_semibold">{{ service.service_number }}</div>
      <a href="service-details.html" class="cs_image_box_img cs_radius_5 overflow-hidden">
        <img src="{% static 'img/studio-agency/service_img_1.jpeg' %}" alt="Service">
      </a>
      <div class="cs_image_box_info position-relative">
        <h2 class="cs_image_box_title cs_fs_29 cs_semibold"><a href="service-details.html">{{ service.title }}</a></h2>
        <p class="cs_image_box_subtitle mb-0">{{ service.content }}</p>
        <a href="service-details.html" class="cs_image_box_btn cs_center position-absolute rounded-circle">
          <img src="{{ service.photo|thumbnail_url:'service_image'}}" alt="{{ service.title }}" class="rounded-6">
        </a>
      </div>
    </div>
  </li>
  {% endfor %}

我无法将object_list添加到我的上下文。你能帮助我在哪里添加我的服务queryset的上下文吗?
谢谢

liwlm1x9

liwlm1x91#

因此,CMS插件(CMSPlugin的示例)可以在CMS页面上使用。但是当你创建应用钩子时,插件的处理方式就不同了。
如果这些插件在其他页面上使用,并且您还希望将它们带入appook的页面,则需要在应用中创建模型示例,然后在模型上创建PlaceholderField。然后,您可以将这个模型示例呈现到一个页面上,并依次呈现占位符以显示附加的插件。
CMS插件需要与占位符相关联。我想你会在你的常规CMS模板中看到这些,但是当使用appooks的时候,情况就有点不同了。在CMS之外的占位符上可以找到here
这是一个非常复杂的应用程序,但它是如何实现django-cms功能的一个很好的例子。看看它的PlaceholderField实现在这里。在这里,您可以将博客添加到页面,然后创建帖子。然后通过PlaceholderField将内容添加到帖子中,这样当你编辑时,它就像一个普通的页面,你可以添加你经常使用的所有插件。

  • (澄清一下,我是django-cms协会的技术负责人。)*

相关问题