有没有一种方法可以将模型属性传递给另一个属性?

时间:2019-08-20 21:22:10

标签: django

我正在使用{%autoescape off%}渲染通过管理页面添加的html。我想获取模型的另一个变量。

post.html

{% autoescape off %}
    {{ post.content }}
{% endautoescape %}

是否可以将同一模型的另一个属性传递到post.content中?像这样

post.content

<img src="{{ post.main_image.url }}">

2 个答案:

答案 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)