当模型字段类型从 CharField 更改为 ForeignKey

时间:2021-01-15 18:09:22

标签: django django-models django-templates

我有一组模板,它们都以相同的 object_list 开头。第一个 (reviews_list) 显示对象列表中的每个项目。其余部分显示基于属性的项目子集:{% if review.library == "Movies" %}

这一直很好,直到我更改了评论模型。 library 曾经是一个 CharField,现在它是一个 ForeignKey,尽管该字段的名称没有改变。 review_list 仍然可以正确呈现,但所有其他模板都显示为空。我已经尝试了以下两种方法,但一切仍然是空的。

library 的 pk 作为字符串: {% if review.library == "1" %}

library 的 pk 作为 int:{% if review.library == 1 %}

我在迁移前擦除了数据库,然后重新填充,所以应该不会出现任何奇怪的数据问题。

模板很短,所以贴在下面。如何根据 fk 字段的值在模板中显示项目?谢谢

{% extends 'base.html' %}
{% block title %}TV Reviews{% endblock title %}

{% block content %}
<h1 class="jumbotron-fluid">List Of TV Reviews</h1>
    {% for review in object_list %}
        {% if review.library == 'TV' %} <!-- This is the relevant line -->
            <div class="card">
                <a href="{% url 'review_detail' review.pk %}"><div class="card-header">
                    <span class="font-weight-bold">
                        {{ review.title }}
                </span> &middot;
                    <span class="text-muted">by {{ review.author }} | {{ review.date }}</span>
                </div></a>
                <div class="card-body">
                    {{ review.review_body }}
                </div>
                {% if user == review.author %}
                <div class="card-footer text-center text muted"><a
                        href="{% url 'review_edit' review.pk %}">Edit</a>
                    | <a
                        href="{% url 'review_delete' review.pk %}">Delete</a>
                </div>
                {% endif %}
            </div>
            <br />
        {% endif %}
    {% endfor %}
    <div align="center"><a href="{% url 'review_list' %}"><button type="button"
                                                 class="btn btn-info">Back to
    Main List</button></a></div>
{% endblock content %}

如果相关,以下是模型:

class Library(models.Model):
    library = models.CharField(max_length=200)
    lib_desc = models.TextField(null=True)

    def __str__(self):
        return self.library

class Review(models.Model):
    library = models.ForeignKey(Library, on_delete=DO_NOTHING,)
    title = models.CharField(max_length=200)
    review_body = models.TextField(null=True)
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(get_user_model(), on_delete=DO_NOTHING,)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('review_detail', args=[str(self.id)])

1 个答案:

答案 0 :(得分:0)

由于您更改了模型,您必须以相同的方式更新模板(添加另一个库属性)。

现在应该可以了:

{% if review.library.library == 'TV' %} 

请注意,即使您实现了 __str__ 函数,此比较的模板中也不会调用此函数(但打印函数会显示所需的输出)。