亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

用python搭建一個校園維基網站(二)—— 可編輯內容的首頁的創建

標簽:
Python

项目总体简介请看用python搭建一个校园维基网站(一)
本文可独立使用,创建了一个可编辑内容的首页,展示了wagtail的一些基础用法。文末为本文所创项目文件github地址。
比较详细,新手可尝试,不过最好有一定Django基础。

项目结构概观

  • 首先使用wagtail start geniuspip install wagtail安装依赖)创建名为genius的工程文件夹,cd genius进入目录。

  • 在windows命令行输入tree /a /f > 1.txt在当前目录下生成1.txt看到如下的项目结构。

E:.|   manage.py
|   requirements.txt|   
+---genius
|   |   urls.py
|   |   wsgi.py
|   |   __init__.py
|   |   
|   +---settings|   |       base.py|   |       dev.py|   |       production.py|   |       __init__.py|   |       |   +---static
|   |   +---css
|   |   |       genius.css|   |   |       
|   |   \---js
|   |           genius.js
|   |           
|   \---templates|           404.html
|           500.html|           base.html
|           +---home|   |   models.py|   |   __init__.py|   |   |   +---migrations
|   |       0001_initial.py
|   |       0002_create_homepage.py
|   |       __init__.py
|   |       
|   \---templates|       \---home
|               home_page.html|               
\---search
    |   views.py    |   __init__.py
    |   
    \---templates
        \---search
                search.html
  1. manage.pyDjango项目通用的管理脚本(通过python manage.py 某命令参数使用)。

  2. requirements.txt用于存储当前项目的依赖列表(自动生成的为Djangowagtail,虚拟环境(virtualenv)下可用pip freeze >> requirements.txt追加)。

  3. genius包含项目主要信息,有主路由(urls.py)、wsgi接口(wsgi.py)、配置文件夹(分基础配置base.py、开发环境配置dev.py与生产环境配置production.py,后二者依赖基础配置)、全局静态资源文件夹(static)与模板资源文件夹(templates)。

  4. home是自动生成的app文件夹,包含了models.py页面数据模型和templates模板文件夹。默认生成的models.py中定义了一个简单的HomePage类(继承自wagtailPage类)来代表一个页面(即默认的欢迎页)的模型(该简单模型的可编辑内容部分只有title字段)。在wagtail的概念中,页面模型和模板文件是默认关联的,如HomePage默认对应的模板为templates/home/home_page.html(注意命名的转换关系),而欢迎页http://127.0.0.1:8000中的大部分内容就在该模板中(该模板使用extends语句继承genius\templates\base.html,并使用block语句填充相应内容)。如下:

# 在命令行中先迁移数据库再启动服务,即可在本地查看欢迎页面python manage.py migratepython manage.py runserver

欢迎页


欢迎页模板 - templates/home/home_page.html

  1. search则是自动生成的提供搜索功能的app文件夹,由于基于wagtail.wagtailsearch所以只包含了views.py视图文件和templates模板文件夹。暂时不管。

创建wiki主页

  • 我们先清空数据库,python manage.py flush或者直接删除db.sqlite3数据库文件。

  • 在项目根目录下删除home文件夹,新建一个名为wiki的文件夹代表wikiapp,并将genius\settings\base.py配置文件中第28行左右的INSTALLED_APPS列表中的home改为wiki,以此来向配置文件注册我们的app。并在wiki文件夹里添加目录和空文件:

\---wiki    |   models.py
    |   __init__.py    |   
    +---migrations
    |       __init__.py    |       
    \---templates
        \---wiki
  • 现在创建我们的主页模型,主要元素如下:


    我们的WikiHome页面模型中需要图中红色高亮的一系列字段,其中title字段继承自Page类,不用额外添加,image字段为连接到wagtailimages.Image模型的外键。content_panels列表提供了该页面模型在后台管理编辑页面的呈现内容。
    此外,对于TopLinkLittleIntros我们需要另外新建两个继承wagtail提供的Orderable(使有序)的非页面模型。


    WikiHomeLittleIntros的字段有fontawesome图标类名,小标题和简述,如下图。还包含了一个wagtail提供的对ForeignKey进行了一层封装的ParentalKey外键连接到它所属的WikiHome页面。类似的,panels表明出现在可编辑区。



    WikiHomeTopLink类似,为了层次上更清晰,采用了多重继承,在models.py中只定义ParentalKey外键,而在另一个文件中定义了RelatedLink模型,包含的字段有链接文本和具体链接,只是具体链接可能为外链、某个页面或某个文档,占用了三个字段,此外还利用@property装饰器为该模型添加了link属性,来返回它的具体链接,这样在模板中就可以使用.link调用。
    综上,models.py的内容为:

# -*- coding: utf-8 -*-from __future__ import absolute_import, unicode_literalsfrom django.db import modelsfrom modelcluster.fields import ParentalKeyfrom wagtail.wagtailcore.models import Page, Orderablefrom wagtail.wagtailadmin.edit_handlers import (
    FieldPanel, InlinePanel)from wagtail.wagtailimages.edit_handlers import ImageChooserPanelfrom .umodels import RelatedLink# ------------------------主页-------------------------class WikiHome(Page):
    logoname = models.CharField(
        max_length=255,
        help_text=u"显示在左上角的网页名称"
    )
    image = models.ForeignKey(        'wagtailimages.Image',
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name='+',
        help_text=u"大幅背景图"
    )
    intro = models.TextField(
        blank=True,
        help_text=u"下方简单口号"
    )

    content_panels = Page.content_panels + [
        FieldPanel('logoname'),
        InlinePanel('toplinks', label="顶部右侧链接"),
        ImageChooserPanel('image'),
        FieldPanel('intro', classname="full"),
        InlinePanel('little_intros', label="下方一排推广简述"),
    ]class WikiHomeTopLink(Orderable, RelatedLink):
    page = ParentalKey('wiki.WikiHome', related_name='toplinks')class WikiHomeLittleIntros(Orderable):
    page = ParentalKey(WikiHome, related_name='little_intros')
    fa_name = models.CharField(blank=True, max_length=250,
                               help_text=u'''FontAwesome图标类名
                               - 参考fontawesome.io/icons/''')
    title = models.CharField(blank=True, max_length=250,
                             help_text=u"小标题")
    caption = models.CharField(blank=True, max_length=1000,
                               help_text=u"简述")

    panels = [
        FieldPanel('fa_name'),
        FieldPanel('title'),
        FieldPanel('caption'),
    ]

models.py旁新建umodels.py文件供models.py引用:

#--------------------------umodels.py----------------------------#from django.db import modelsfrom wagtail.wagtailadmin.edit_handlers import (FieldPanel,
                                                PageChooserPanel,
                                                MultiFieldPanel)from wagtail.wagtaildocs.edit_handlers import DocumentChooserPanelclass LinkFields(models.Model):
    link_external = models.URLField("External link", blank=True)
    link_page = models.ForeignKey(        'wagtailcore.Page',
        null=True,
        blank=True,
        related_name='+'
    )
    link_document = models.ForeignKey(        'wagtaildocs.Document',
        null=True,
        blank=True,
        related_name='+'
    )    @property
    def link(self):
        if self.link_page:            return self.link_page.url        elif self.link_document:            return self.link_document.url        else:            return self.link_external

    panels = [
        FieldPanel('link_external'),
        PageChooserPanel('link_page'),
        DocumentChooserPanel('link_document'),
    ]    class Meta:
        abstract = True# Related linksclass RelatedLink(LinkFields):
    title = models.CharField(max_length=255, help_text="链接显示文本")

    panels = [
        FieldPanel('title'),
        MultiFieldPanel(LinkFields.panels, "Link"),
    ]    class Meta:
        abstract = True
點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消