本地django管理员或grappelli的streamfield

django-streamfield的Python项目详细描述


Django流场

这是对streamfield思想的一个简单的实现 从Wagtail CMS

亮点

您可以用不同类型的块构建页面。 对它们进行排序,并对块内的列表进行排序。

为了编辑块内的内容,它在django管理界面中使用本机弹出机制。 这允许您在块内按原样使用其他字段的小部件。 例如,如果要在块文件浏览字段中使用 从django文件浏览器,它将完美地工作 没有任何附加设置。

模块还可以使用Grappelli Interface(可选)

django-streamfield demo screenshot

内容

安装

pip install django-streamfield

如何使用

1。创建名为streamblocks

的新应用程序

2。放入streamblocks/models.py一些型号

…要在流字段中使用的。 并将此模型添加到streamblocks_models列表中。 例如:

# streamblocks/models.py# one objectclassRichText(models.Model):text=models.TextField(blank=True,null=True)classMeta:# This will use as name of block in adminverbose_name="Text"# list of objectsclassImageWithText(models.Model):image=models.ImageField(upload_to="folder/")text=models.TextField(null=True,blank=True)# StreamField option for list of objectsas_list=TrueclassMeta:verbose_name="Images with text"# Register blocks for StreamField as list of modelsSTREAMBLOCKS_MODELS=[RichText,ImageWithText]

3。为上面的每个模型创建模板,命名为模型的小写名称:

  1. streamblocks/templates/streamblocks/richtext.html
  2. streamblocks/templates/streamblocks/imagewithtext.html

使用block_content作为上下文。

Note: block_content will be single object if no 'as_list' property in your model, and will be a list of objects if there is.

<!--richtext.html--><divclass="rich-text-block">
    {{ block_content.text|safe }}
</div>
<!--imagewithtext.html--><ulclass="image-with-text-block">
    {% for block in block_content %}
    <li><imgsrc="{{ block.image.url }}"alt=""><p>{{ block.text }}</p></li>
    {% endfor %}
</ul>

^{str 1}4美元。将应用程序添加到settings.py

添加到已安装的应用程序

INSTALLED_APPS=[...'streamblocks','streamfield',...

^{str 1}5美元。将streamfield.url添加到main url.py

urlpatterns+=[path('streamfield/',include('streamfield.urls'))]

^{str 1}6美元。在应用程序中将streamfield添加到模型中

并将要在此流中使用的模型添加为模型列表

# models.pyfromstreamfield.fieldsimportStreamFieldfromstreamblocks.modelsimportRichText,ImageWithTextclassPage(models.Model):stream=StreamField(model_list=[RichText,ImageWithText],verbose_name="Page blocks")

如果你的“页面”在上下文中, 您可以通过field cached property page.stream.render获取内容

...
<divclass="content">
    {{ page.stream.render }}
</div>
...

管理

Block模型的自定义管理类

模型将自动在管理中注册。 如果你想提供自定义管理类, 首先,使用StreamBlocksAdmin类注销模型并再次注册。

# streamblocks/admin.pyfromdjango.contribimportadminfromstreamfield.adminimportStreamBlocksAdminfromstreamblocks.modelsimportRichTextadmin.site.unregister(RichText)@admin.register(RichText)classRichTextBlockAdmin(StreamBlocksAdmin,admin.ModelAdmin):pass

admin

中渲染块模型的自定义模板

如果需要为正在使用的块模型自定义管理模板,则需要将名为 如第3节(上文)所述。但把它放在“管理员”文件夹里。

例如,对于richtext块,它将是:

streamblocks/templates/streamblocks/admin/richtext.html

作为上下文使用“form”:

{{ form.text.value }}

覆盖admin

中的字段渲染

将字段的自定义模板命名为小写字段小部件名称,并将其放入…admin/fiedls/文件夹中。

例如,对于richtext块的textfield小部件(textarea),它将是: streamblocks/templates/streamblocks/admin/fields/textarea.html

作为上下文使用“field”:

{{ field.value|default:""|safe }}

在admin.py

中覆盖streamfield的块列表

通常,您将模型中的块设置为streamfield字段的model_list属性。 但是,如果您想更改块,例如根据对象,可以在管理站点中进行更改 你的模特。假设您只想在id=1的页面上使用RichText

# admin.pyfromstreamfield.fieldsimportStreamFieldWidgetfromstreamblocks.modelsimportRichTextfrom.modelsimportPageclassPageAdmin(models.Admin):defget_form(self,request,obj=None,**kwargs):form=super().get_form(request,obj,**kwargs)ifobjandobj.id==1:form.base_fields['stream'].widget=StreamFieldWidget(attrs={'model_list':[RichText]})returnform
<>注意数据库中已经存在的块。如果从管理中删除它们,则会产生错误。

特殊情况

复杂块

可以使用streamfield作为块的一部分,并使用这种方式创建复杂的结构 并使用{{ block_content.<field_name>.render }}

数据库中没有数据的块。仅模板。

你可以将它用于小部件或分隔符,或者你想要的任何东西… 只需制作块模型abstract

classEmptyBlock(models.Model):classMeta:abstract=Trueverbose_name='Empty space'

并对内容使用streamblocks/templates/streamblocks/emptyblock.html

Note: Don't forget to register a block in STREAMBLOCKS_MODELS

用于减少数据库请求数的缓存

缓存有两种方式:

  • 使用django缓存的简单缓存视图
  • 创建其他字段,例如:“stream\u rendered” 并在save met中呈现到此字段html霍德
defsave(self,*args,**kwargs):self.stream_rendered=self.stream.rendersuper().save(*args,**kwargs)

…并在HTML中使用此字段

设置

# settings.py

streamfield_streamblocks_app_path

如果应用程序streamblocks不在项目根目录中,则需要在settings.py中反映它。

STREAMFIELD_STREAMBLOCKS_APP_PATH='yourapps.streamblocks'

streamfield_block_选项

您可以使用settings.py中的STREAMFIELD_BLOCK_OPTIONS添加一些要阻止的选项。

例如:

STREAMFIELD_BLOCK_OPTIONS={"margins":{"label":"Margins","type":"checkbox","default":True}}

在模板中使用{{ options.margins }}

Note: Now only type "checkbox" is working, the other options in plan.

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
打印val在Java中可以用作变量吗?   java如何以矩阵格式存储2D数组(带逗号)   java获取空的响应正文,带有Inversion2>无法填充数据   java Jackson UnrecognizedPropertyException存在时引发   java为什么我可以在非公共类中拥有公共成员?   如何在Java中从外部库导入包?   java如何从不推荐使用的日期类型替换getDate()?   java如何将数据集转换为JavaPairDD?   如何在JavaSpring中创建3d数组   合法线程操作的java定义   如何从java文本文件中读取输入   从StringArray java中的标记/单词构建句子   将UDP从Java发送到Python不起作用   java显示组织。日食xsd。XSDSchema内容