无法文本比较Django模型字段

时间:2018-02-23 15:57:00

标签: django django-models foreign-keys

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

我在index.html页面上显示这些报告及其相关信息。我想根据特定报告所具有的“UserTechnology”值将传递的URL切换到我们链接报告的位置。

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

我认为问题在于我没有比较我在处理ForeignKey关系时所做的比较,但我不确定如何为报告以外的特定报告访问UserTechnology.Name的值。 UserTechnology。

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

的index.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 %}

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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

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

将report.UserTechnology与'FileManager'进行比较时,您正在比较report.UserTechnology对象。 &LT; UserTechnology:2&gt; =='FileManager'是假的。

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

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