如何在模型 TextField 的 HTML 中使用 Django 模板变量?

Posted

技术标签:

【中文标题】如何在模型 TextField 的 HTML 中使用 Django 模板变量?【英文标题】:How can I use a Django template variable in HTML in a model TextField? 【发布时间】:2018-02-05 12:04:04 【问题描述】:

我想以编程方式生成外部 url,而不是在 html 中硬编码它们,以防它们中的任何一个在某个时候发生变化

在我的模板中有这个。

<p>
 article.text|safe 
</p>

我的文章类是这样的。

class Article(models.Model):
    title = models.CharField(max_length=200)
    teaser = models.TextField(default = "")
    text = models.TextField()
    category = models.CharField(max_length=100)
    image_name = models.CharField(default = "", max_length=100)
    published_date = models.DateField(blank=True, null=True)

我的视图类是这样的。

class Article_Page(TemplateView):
    model = Article
    template_name="articles/article.html"

    def get_context_data(self, **kwargs):
        context = super(Article_Page,self).get_context_data(**kwargs)
        context['article'] = Article.objects.get(pk=kwargs['pk'])
        context['external_urls'] = External_Urls()
        return context

class External_Urls(object):
    stack_overflow = 'https://***.com'

在我的模型中的 TextField 中我有这个。

<a href=" external_urls.stack_overflow >Stack Overflow</a> 

如果我将它直接包含在模板中,那一行 HTML 将提供指向 https://***.com 的链接,但如果它在模型 TextField 中,则链接将转到 'http://127.0.0.1:8000/articles/pk/ external_urls.stack_overflow '。

如何在 TextField HTML 中转义模板变量?

【问题讨论】:

您必须在 HTML 中的属性周围加上引号:href=" external_urls.stack_overflow "。请先解决这个问题,然后更新您的问题:) 模板引擎将在引号内呈现变量的任何一种方式都不起作用 我不确定你想在这里做什么。您的模型的text 字段中是否保存了 django 模板代码?如果要插入正确的链接,则必须对文本字段的内容进行模板渲染。 这是你想做的吗? ***.com/questions/11874325/… @ArpitSolanki> 肯定会的。问题不在于渲染,问题在于没有引号你会得到无效的 html。浏览器会尝试给它一个含义,但你不能确定如何。 【参考方案1】:

试试

class Article_Page(TemplateView):
    model = Article
    template_name="articles/article.html"

    def get_context_data(self, **kwargs):
        context = super(Article_Page,self).get_context_data(**kwargs)
        context['article'] = Article.objects.get(pk=kwargs['pk'])
        context['external_urls'] = 'https://***.com'
        return context

在你的模板中放external_urls,如果你想创建很多url,你可以使用列表或字典,字典的例子是:

context['external_urls'] = ['url1':'https://***.com', 'url2':'https://facebook.com']

在你的模板中:

external_urls.url1 #return ***.com

【讨论】:

我仍然有同样的问题,“external_urls.url1”包含在插入到 django 模板中的 TextField 中时,被视为字符串而不是模板变量。 你是个 texfield 的人,它对我有用,也许将 [] 替换为 我的意思是对象来自的模型中的 TextField,我在这个 TextField 中有我想要呈现的 HTML。我解决了它,原帖中的解决方案。【参考方案2】:

基于此:

class Article_Page(DetailView):
    model = Article
    template_name="articles/article.html"

    def get_context_data(self, **kwargs):
        context = super(Article_Page, self).get_context_data(**kwargs)

        d = 'external_urls':'***.com':'http://www.***.com/'
        rendered = Template(self.object.text).render(Context(d))

        context['article'] = self.object
        context['article_text_rendered'] = rendered
        return context

然后在 HTML 中:

<p>
    article_text_rendered 
</p>

这里的关键是TextField中的HTML(即article.text和page_object.text)不能使用与页面相同的上下文,所以你必须先用它自己的上下文来渲染它。

【讨论】:

以上是关于如何在模型 TextField 的 HTML 中使用 Django 模板变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中使非数据库模型具有两个属性

如何在swift中使基类属性通用,以便可以与多种模型类型一起使用?

在 Django 的 TextField 中禁用 HTML 转义

Django模型TextField不呈现

如何在 Html 中使按钮居中? [复制]

如何在 Codeigniter 中使视图“可移植”?