Plone学习6——plone training 26 Exercise

Plone学习6——plone training 26 Exercise

Eercise要求与提示

参考链接

	1,创建一个可/@@demo_content在新文件中调用的新BrowserViewdemo.py
	2,该视图应在每次调用时创建5个会话
	3,使用https://docs.plone.org/develop/plone.api/docs/content.html#create-content上的文档了解如何创建新的会话。
	4,使用plone.api.content.transition发布的所有新一轮会谈。找到该方法的文档。
	5,只有管​​理员才能使用该视图(该权限称为cmf.ManagePortal)。
	6,调用视图后重新加载首页。
	7,显示有关结果的消息(https://docs.plone.org/develop/plone.api/docs/portal.html#show-notification-message)。
	8,如需额外积分,请使用图书馆请求和http://www.icndb.com/api/通过笑话填充会谈。
	9,使用实用程序方法cropText从Producs.CMFPlone.browser.ploneview.Plone20个字符后裁剪标题。

官方实现

  • 在browser/configure.zcml内添加以下代码
<browser:page
  name="demo_content"
  for="*"
  class="ploneconf.site.browser.demo.DemoContent"
  permission="cmf.ManagePortal"
  />

新增了一个page,name为demo_content,可以用@@demo_content访问该page,该page被访问的时候会触发ploneconf.site.browser.demo.DemoContent的__call__()方法,后面会谈到。

  • 然后在browser/demo.py里添加以下内容
# -*- coding: utf-8 -*-
from Products.Five import BrowserView
from plone import api
from plone.protect.interfaces import IDisableCSRFProtection
from zope.interface import alsoProvides

import json
import logging
import requests

logger = logging.getLogger(__name__)


class DemoContent(BrowserView):

    def __call__(self):
        portal = api.portal.get()
        self.create_talks(portal)
        return self.request.response.redirect(portal.absolute_url())

    def create_talks(self, container, amount=5):
        """Create some talks"""

        alsoProvides(self.request, IDisableCSRFProtection)
        plone_view = api.content.get_view('plone', self.context, self.request)
        jokes = self.random_jokes(amount)
        for data in jokes:
            joke = data['joke']
            talk = api.content.create(
                container=container,
                type='talk',
                title=plone_view.cropText(joke, length=20),
                description=joke,
                type_of_talk='Talk',
            )
            api.content.transition(talk, to_state='published')
            logger.info(u'Created talk {0}'.format(talk.absolute_url()))
        api.portal.show_message(
            u'Created {0} talks!'.format(amount), self.request)

    def random_jokes(self, amount):
        jokes = requests.get(
            'http://api.icndb.com/jokes/random/{0}'.format(amount))
        return json.loads(jokes.text)['value']

这份代码有几个点值得讲:

  • 首先是__call__()方法会在page被访问时调用
  • 在用api.content.create()方法创建talks时,需要传入一个container,这个来自于__call__()里的portal = api.portal.get()
  • 由于是GET方法访问该page,所以需要alsoProvides(self.request, IDisableCSRFProtection)来防止跨域攻击
  • api.content.transition(talk, to_state=‘published’)用这行代码可以把创建的talk的发布状态改为published

访问/Plone/@@demo_content,即可成功创建5个talk,在/Plone/talklistview页面可以看到创建好的talk的list
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值