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 %}