如何解决Django {% if object.foreignkey %} 返回相反的值
所以我有两个模型。
第一个是收藏标题,第二个是标题状态。 在标题状态中,我有一个名为 collection_title_status 的外键,指向 CollectionTitle。
我在 collection_title_detail.html 中使用 DetailView 和 FormMixin 呈现了表单 TitleStatusForm。表单是模态的。
在全球范围内,这部分有效,这意味着我可以填写表格,它保存数据并在 Collection Title 和 Title Status 的外键之间创建链接(例如,如果 CollectionTitle id 为 61,我的 collection_title_status 值也将是 61)。
我想做什么:
-
如果收藏标题未链接到标题状态(意味着用户尚未启动状态监控),那么我想显示名为“启动”的按钮,该按钮打开包含 TitleStatusForm 的模式以启动标题状态模型
-
如果收藏标题已经链接到标题状态(应该在完成上述第一步后完成),那么我不想显示上面提到的按钮和模式。相反,我想显示用户之前为每个字段输入的值。
所以这是我尝试这样做的方式:
models.py(我没有故意包含不同的选择)
class CollectionTitle(models.Model):
collection = models.ForeignKey(Collection,related_name="has_titles",on_delete=models.CASCADE)
type = models.CharField(max_length=10,choices=CHOICES,default=MOBILE)
title = models.CharField(max_length=20,null=True)
date_posted = models.DateTimeField(default=timezone.Now)
class TitleStatus(models.Model):
collection_title_status = models.ForeignKey(CollectionTitle,related_name="has_status",on_delete=models.CASCADE,null=True)
is_active = models.CharField(max_length=20,choices=IS_ACTIVE,null=True)
check_one = models.CharField(max_length=20,choices=IS_DONE,null=True)
check_one_date = models.DateField(default=datetime.date.today)
views.py
class CollectionTitlesDetail(LoginrequiredMixin,FormMixin,DetailView):
model = CollectionTitle
form_class = TitleStatusForm
template_name = 'taskflow/collection_titles_detail.html'
success_url = None
def get_context_data(self,**kwargs):
context = super(CollectionTitlesDetail,self).get_context_data(**kwargs)
context['tgt_titles'] = CollectionTitle.objects.filter(collection=self.object.collection)
context['checks'] = TitleStatusForm()
return context
def post(self,request,*args,**kwargs):
form = TitleStatusForm(request.POST)
tgt = self.get_object()
if form.is_valid():
new_status = form.save(commit=False)
new_status.collection_title_status = tgt
new_status.is_active = 'Actif'
new_status.save()
return redirect('taskflow:collection_titles')
else:
return redirect('taskflow:collection_all')
collection_titles_detail.html
{% if object.has_status %}
<p>TRUE</p> #to test it I just wrote this
{% else %}
display button + modal to initiate Status
{% endif %}
因此,根据上面的代码,如果我运行服务器并转到例如 /collection/titles/31/,我应该能够看到启动按钮,因为没有链接到带有 id 的集合标题的标题状态31.(实际上数据库中根本没有 Title Status)。但是我得到了
TRUE
结果..如果我将 if 条件更改为 if not,我会得到启动按钮......而我会得到 TRUE..
最后,如果我这样做:
{% if not object.has_status %}
display button + modal to initiate Status
{% else %}
<p>TRUE</p> #to test it I just wrote this
{% endif %}
我再次得到 TRUE 而我应该得到启动按钮...
所以有些事情我显然做错了,而且我显然不明白。
任何帮助将不胜感激。
非常感谢!!
解决方法
has_status
是一个 RelatedManager
并且始终为“True”,您需要对管理器执行查询以确定是否有任何相关对象。 exists
是为此执行的最简单的查询
{% if not object.has_status.exists %}
display button + modal to initiate Status
{% endif %}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。