【问题标题】:Can't text compare Django model field无法对 Django 模型字段进行文本比较
【发布时间】:2018-08-03 17:44:52
【问题描述】:

我在 Django 中设置了一个“报告”模型,它代表上传到网站的特定报告。此模型与“UserTechnology”模型具有 ForeignKey 关系,该模型是最终用户可以访问上传报告的所有可用方式的列表。

我在 index.html 页面上显示这些报告和一些关于它们的信息。我想根据特定报告的“UserTechnology”值将传递的 url 切换到我们链接报告的位置。

当尝试将报告的 UserTechnology 值与任何内容进行比较时,就会出现问题。例如,如果我只显示{{ report.UserTechnology }} 它工作正常,示例值为“FileManager”。但是,如果我尝试像{% "file" in report.UserTechnology %}{% report.UserTechnology == "FileManager %} 这样的东西,它总是返回False。

我认为问题在于在处理 ForeignKey 关系时我没有比较我认为我正在比较的内容,但我不确定如何访问除报告之外的特定报告的 UserTechnology.Name 的值。用户技术。

models.py:

class Report(models.Model):
    Name = models.CharField(max_length=200, default=None, null=True)
    LastUpdated = models.DateTimeField('date published', default=None, 
    null=True)
    SharePointURL = models.CharField(max_length=500,default=None, null=True)
    FileManagerLocation = models.TextField(default=None, null=True)
    ReportText = models.CharField(max_length=400, default=None, null=True)
    ReportImage = models.ImageField(default=None, null=True)
    Category = models.ForeignKey(Category, default=None, null=True, 
    on_delete=models.CASCADE)
    UserTechnology = models.ForeignKey(UserTechnology, default=None, 
    null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.Name

class UserTechnology(models.Model):
    Name = models.CharField(max_length=50, default=None, null=True)

    def __str__(self):
        return self.Name

索引.html:

{% for report in reports %}
    {% if forloop.counter0|divisibleby:4 %} <div class="row"> {%  endif %}
        <div class="col-lg-3 col-md-4 col-sm-6 portfolio-item">
            <div class="card h-100">
                <a href="{{ report.SharePointURL }}" target="_blank"><img class="card-img-top" id="reportImage" src="{{ report.ReportImage.url }}" alt=""></a>
                <div class="card-body">
                    <h4 class="card-title">
                        <a href="{{ report.SharePointURL }}" target="_blank">{{ report.Name }}</a>
                    </h4>
                    <p class="card-text">{{ report.ReportText }}</p>
                </div>
            </div>
        </div> <!-- portfolio-item -->
{%  if forloop.counter|divisibleby:4 or forloop.last %}</div><!-- row closing --><hr>{%  endif %}
{% endfor %}

【问题讨论】:

    标签: django django-models foreign-keys


    【解决方案1】:

    当您在模板中呈现 report.UserTechnology 时,Django 模板语言会隐式返回 UserTechnology 上的隐藏类方法 str,但这不是您要比较的相等性。

    如果要将report.UserTechnology与字符串进行比较,需要指定对应的属性。

    即,report.UserTechnology.Name == 'FileManager'。

    当您将 report.UserTechnology 与“FileManager”进行比较时,您是在比较 report.UserTechnology 对象。 == 'FileManager' 为 False。

    实时查看此内容的一个好方法是在您的代码中使用堆栈跟踪。

    在您的视图逻辑中,您可以添加import pdb; pdb.set_trace()。当您运行代码时,服务器将在该点停止,请尝试针对您的报表对象运行一些打印语句。

    【讨论】:

    • 谢谢,这些跟踪信息将来会有所帮助。
    【解决方案2】:

    report.UserTechnology 是一个 ForeignKey,它指向整个 UserTechnology 对象。如果要与字符串进行比较,则需要与对象上的某个字段进行比较:

    {% if report.UserTechnology.Name == "FileManager %}
    

    【讨论】:

    • 我想我错过了一些基本的东西。谢谢。
    猜你喜欢
    • 2019-06-30
    • 2014-12-28
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多