我正在使用{%autoescape off%}渲染通过管理页面添加的html。我想获取模型的另一个变量。
post.html
{% autoescape off %}
{{ post.content }}
{% endautoescape %}
是否可以将同一模型的另一个属性传递到post.content中?像这样
post.content
<img src="{{ post.main_image.url }}">
答案 0 :(得分:0)
是的。假设有一个帖子,并且它有一个main_image,它有一个url,应该没有任何问题。如果您不确定自己是否先确定,则可能需要签入模板。因此,为了安全起见,您应该这样做:
{% if post and post.main_image %}
<img src="{{ post.main_image.url }}">
{% endif %}
答案 1 :(得分:0)
好的,我终于做到了。我的目标是创建模型的CMS管理页面,在其中可以将原始html,django标签和变量以及其他属性(例如标题,类别,图像等)直接添加到content属性。我已经通过使用和自定义django-dbtemplates软件包来做到这一点。
pip install django-dbtemplates
首先,从dbtemplates中派生模板模型,并将您的模型添加为外键
blog/models.py
from dbtemplates.models import Template as CoreTemplate
class Template(CoreTemplate):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
然后只需自定义admin.py即可将模板字段显示为属性
blog/admin.py
from .models import Post, Template
class TemplateInline(admin.TabularInline):
model = Template
extra = 0
class PostAdmin(admin.ModelAdmin):
inlines = [TemplateInline, ]
可选
您可以通过修改Template类的保存功能来基于模型段生成模板的html名称
blog/models.py
from dbtemplates.models import Template as CoreTemplate
from dbtemplates.conf import settings
class Template(CoreTemplate):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
def save(self, *args, **kwargs):
self.last_changed = now()
slug = self.post.slug
self.name = f'{slug}-content.html'
if settings.DBTEMPLATES_AUTO_POPULATE_CONTENT and not self.content:
self.populate()
super(Template, self).save(*args, **kwargs)
然后在您的html中,您可以使用上下文管理器呈现此模板
post.html
{% with post.slug|add:'-content.html' as content %}
{% include content %}
{% endwith %}
现在,在您的管理员设置中,基本模板类中只有一个大内容字段
blog/admin.py
from .models import Template
from django.forms import Textarea
class TemplateInline(admin.TabularInline):
model = Template
extra = 0
fields = ('content',)
formfield_overrides = {
models.TextField: {'widget': Textarea(attrs={'rows': 40, 'cols': 150})},
}
要从管理面板中删除默认的dbtemplates模板类,只需在管理设置中取消注册即可。
blog/admin.py
from dbtemplates.admin import Template as CoreTemplate
admin.site.unregister(CoreTemplate)