【问题标题】:Calling Model method inside template file在模板文件中调用模型方法
【发布时间】:2021-06-22 14:10:12
【问题描述】:

我正在学习使用 django 创建博客网站。在模板文件中调用模型方法时遇到问题。该网站未在正文中显示内容。当我使用 article.body 时它工作正常,但当我使用 article.sn-p 时它不工作。

models.py 文件:-

...

from django.db import models

class Article(models.Model):
    title = models.CharField(max_length = 100)
    slug = models.SlugField()
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    def snippet(self):
        return self.body[:50]

...

articles_list.html 文件:-

...

<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Articles</title>
  </head>
  <body>
    <h1>Articles List</h1>
    <div class="articles">
      {% for article in articles %}
      <div class="article">
        <h2><a href="">{{article.title}}</a></h2>
        <p>{{article.body.snippet}}</p>
        <p>{{article.date}}</p>
      </div>
      {% endfor %}
    </div>
  </body>
</html>

...

views.py 文件:-

...

from django.shortcuts import render
from django.http import HttpResponse
from .models import Article

def articles_list(request):
    articles = Article.objects.all()
    return render(request, 'articles/articles_list.html', {'articles': articles})

...

代码中没有显示错误,但body标签内仍然没有输出。

【问题讨论】:

  • 假设您的代码中的缩进是正确的;如堆栈溢出中所示,str 和 sn-p 不是文章的一部分。
  • 你也只需要 {{article.sn-p}} 而不是 {{article.body.sn-p}}

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


【解决方案1】:

您可以在模板中使用内置的Slice 过滤器

喜欢这个

<p<{{ article.body|slice:":50" }}</p>

但出于某种原因,如果您想从模板中调用任何模型方法,您可以使用@property 装饰器来访问它。

喜欢这个

class Article(models.Model):
    ...

    @property
    def snippet(self):
        return self.body[:50]

【讨论】:

  • slice更好的选择:truncatechars template filter
  • @AbdulAzizBarkat 是的,当然truncatechars 是一个替代选项,我通常不使用它,因为它会在截断字符后添加一个省略号(三个点)。 :)
  • 所有解决方案都有效。感谢您的帮助。
【解决方案2】:

你可以打电话

<p>{{article.snippet}}</p>

代替:

<p>{{article.body.snippet}}</p>

因为sn-p是同模型中的方法所以可以直接调用,body不是ForeignKey

【讨论】:

  • 这在我使用属性装饰器之前不起作用。
猜你喜欢
  • 1970-01-01
  • 2020-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2013-03-07
  • 1970-01-01
  • 2012-02-04
相关资源
最近更新 更多