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

时间:2017-08-28 08:57:46

标签: html django django-models django-templates django-views

我想以编程方式生成外部网址,而不是在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)

我的View类就是这个。

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://stackoverflow.com'

在模型的TextField中我有这个。

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

如果我将{@ 3}}直接包含在模板中,那么该行会提供指向https://stackoverflow.com的链接,但如果它位于模型TextField中,则会链接到http://127.0.0.1:8000/articles/pk/ {{external_urls。 stack_overflow}}&#39;。

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

2 个答案:

答案 0 :(得分: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://stackoverflow.com'
        return context

并在你的模板中放置{{external_urls}},如果你想创建许多网址,你可以使用列表或字典,例如字典:

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

并在您的模板中:

{{external_urls.url1}} #return stackoverflow.com

答案 1 :(得分:1)

基于此:

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':{'stackoverflow.com':'http://www.stackoverflow.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)不能使用与页面相同的上下文,因此您必须首先使用自己的上下文进行渲染。