【问题标题】:How to access value from dict (nested models object) in django?如何从 django 中的 dict(嵌套模型对象)访问值?
【发布时间】:2021-02-17 09:29:01
【问题描述】:
views.py


<pre>class BoardDetailView(DetailView):
    model = Board
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['columns'] = Column.objects.filter(board = self.get_object())
        context['labels'] = Label.objects.filter(board = self.get_object())

        for column in context['columns']:
            context[str(column)] = Task.objects.filter(column = column)
        context['comments'] = Comment.objects.all()
        context['tasks'] = tasks
        print(context)
        return context </pre>

从第一次打印 stmt 开始,我得到了四个 obj [进度、错误、完成、延迟],即 ]>

从第二次打印 stmt 我得到了这些依赖于前四个的 obj。

{'progress': , ]>, 'bugs': ]>, 'finished' : , 'delayed': ]>}

我无法访问模板中的值。请帮帮我。

模板.py

{% for column in columns %}

   <div class="grid-item">
        <article class="media content-section">
          <div class="media-body">
            <div class="article-metadata">
              <a class="mr-2" href="{% url 'board-detail' column.id %}">{{ column.title }}</a>
             {% for task in column.title%}     <! –– ––>
              <div class="article-metadata">
                <a class="mr-2" href="#">{{ tasks.color_category }}</a>
                <a class="mr-2" href="#">{{ task.title }}</a>
                <small class="text-muted">{{ task.description }}</small>
                <a class="mr-2" href="#">{{ task.priority }}</a>
                <a class="mr-2" href="#">{{ board.task.labels }}</a>
              </div>

              {% endfor %}
              {% endwith %}
            </div>
          </div>
        </article>
      </div>
      {% endfor %}

【问题讨论】:

    标签: python django django-models django-views django-templates


    【解决方案1】:

    您不需要将列的相关任务传递到上下文中。你做事的方式最终会在你的上下文中得到不必要的键数量。您可以使用related_name 简单地循环模板中的相关对象。如果您没有设置相关名称,它会自动成为小写的型号名称,并附加"_set"
    我假设Task 有一个指向Column 的外键,因此您可以按如下方式更改您的代码:
    您的意见:

    class BoardDetailView(DetailView):
        model = Board
        
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['columns'] = Column.objects.filter(board = self.get_object())
            context['labels'] = Label.objects.filter(board = self.get_object())
            context['comments'] = Comment.objects.all()
            context['tasks'] = tasks # Where does this variable come from?? If it is global I recommend not to use it.
            print(context)
            return context
    

    现在在您想要列任务的模板中:

    {% for task in column.task_set.all %} <!-- Assuming related name not set and using default task_set -->
    <!-- Your code here -->
    {% endfor %}
    

    我认为 ColumnLabel 似乎也有一个指向 Board 的外键,因此您可以为它们做类似的事情,而不是将它们传递给上下文。

    【讨论】:

    • 它对我有用。'task' 不是我刚刚用于调试但忘记删除的变量。正如你所建议的,我对 Column 和 Label 使用了“select_related”,它对我来说很好,可以节省一些查询获取时间。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多