本地django管理员或grappelli的streamfield
django-streamfield的Python项目详细描述
Django流场
这是对streamfield思想的一个简单的实现 从Wagtail CMS
亮点
您可以用不同类型的块构建页面。 对它们进行排序,并对块内的列表进行排序。
为了编辑块内的内容,它在django管理界面中使用本机弹出机制。 这允许您在块内按原样使用其他字段的小部件。 例如,如果要在块文件浏览字段中使用 从django文件浏览器,它将完美地工作 没有任何附加设置。
模块还可以使用Grappelli Interface(可选)
内容
安装
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。为上面的每个模型创建模板,命名为模型的小写名称:
- streamblocks/templates/streamblocks/richtext.html
- 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.