模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏

Posted

技术标签:

【中文标题】模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏【英文标题】:Django Template Broke When Model Field Type Changed From CharField to ForeignKey 【发布时间】:2021-04-20 19:07:20 【问题描述】:

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

在我更改 Review 模型之前,这一切正常。 library 以前是 CharField,现在是 ForeignKey,尽管字段的名称没有改变。 reviews_list 仍然可以正确呈现,但所有其他模板都显示为空。我已经尝试了以下两种方法,但一切仍然是空的。

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

library 的 pk 中作为整数:% 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】:

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

现在应该可以工作了:

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

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

【讨论】:

完美!谢谢!

以上是关于模型字段类型从 CharField 更改为 ForeignKey 时 Django 模板损坏的主要内容,如果未能解决你的问题,请参考以下文章

从 CharField 更改为 IntegerField - Postgres 列数据类型未更改 Django

将 Backand 字段类型从字符串更改为浮点数,生成有效模型会在新模式中产生错误

将字段输入类型从隐藏更改为文本

协议缓冲区:将字段类型从字符串更改为字符串值向后兼容?

尝试将 MYSQL 的表字段类型从 BLOB 更改为 JSON

将protobuf字段的类型从double更改为float