我在Django中设置了一个“报告”模型,代表上传到网站的特定报告。此模型与“UserTechnology”模型具有ForeignKey关系,该模型是最终用户可以访问上载的报告的所有可用方式的列表。
我在index.html页面上显示这些报告及其相关信息。我想根据特定报告所具有的“UserTechnology”值将传递的URL切换到我们链接报告的位置。
尝试将报表的UserTechnology值与任何内容进行比较时出现问题。例如,如果我只显示{{ report.UserTechnology }}
它可以正常工作,其示例值为“FileManager”。但是如果我尝试{% "file" in report.UserTechnology %}
或{% report.UserTechnology == "FileManager %}
之类的东西,它总会返回False。
我认为问题在于我没有比较我在处理ForeignKey关系时所做的比较,但我不确定如何为报告以外的特定报告访问UserTechnology.Name的值。 UserTechnology。
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
{% 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 %}
答案 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()
。运行代码时,服务器将在此时停止,尝试针对报表对象运行一些打印语句。