Django + HTML模板无法正确显示

时间:2017-09-24 03:08:50

标签: django django-1.11

  

我想表示news_list列表,结果应该像使用2个循环的样式:     类别1         - info_record 1         - info_record 2     产品组别         - info_record 3

     

问题是,内部循环{%for p in p_list.p.name%}总是没有发生,同时可以正确检索外部循环{%p for p_category%}。

html模板文件如下所示,

{% block content %}
    <div class = "container">
    {% for p in p_category %}
         <div class = "row" >
            ......... {{p}}
            </br>
         </div>
         {% for m in p_list.p.name %}
         <div calss ="row">
          .. <a href = "/pubinfo/{{m.slug}}" > {{m.title}} - [     {{m.created}}] </a>
         </div>
         {% endfor %}
   {% endfor %}
</div>
{% endblock %}

视图文件如下所示,

from django.shortcuts import render
from datetime import datetime
from .models import Category
from .models import PostInfo


def list_all(request):

post_categories = Category.objects.all()
post_lists ={}

for cate in post_categories:

    post_lists[cate.name] = PostInfo.objects.all().filter(category = cate)

import pdb; pdb.set_trace()

return render(request, 'pub_post.html', {'p_category': post_lists.keys(), "p_list": post_lists})

模型文件如下所示,

from django.db import models
from django.contrib.auth.models import User

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=200,
                           db_index=True)
    slug = models.SlugField(max_length=200,
                           db_index=True,
                           unique=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'
    def __str__(self):
    return self.name

class PostInfo(models.Model):
    title = models.CharField(max_length=200,
                           db_index=True)
    slug = models.SlugField(max_length=200,
                           db_index=True,
                           unique=True)
    content = models.TextField(blank=True,
                           null=True)
    category = models.ForeignKey(Category,
                             related_name='post_category') 
    created = models.DateTimeField(auto_now_add=True)   
    updated = models.DateTimeField(auto_now=True)       
    created_by = models.ForeignKey(User, related_name='created_by_user')
    updated_by = models.ForeignKey(User, related_name='updated_by_user')


    class Meta:
        ordering = ('updated',)
        # verbose_name = 'post'
        # verbose_name_plural = 'posts'
    def __str__(self):
        return self.title

感谢所有人都能帮助我,再次感谢你。

1 个答案:

答案 0 :(得分:0)

那是因为 p_list 是字典。

试试这个:

     {% for key, value in p_list.items %}
     {% if key == p %}
     {% for m in value %}
     <div calss ="row">
      .. <a href = "/pubinfo/{{m.slug}}" > {{m.title}} - [     {{m.created}}] </a>
     </div>
     {% endfor %}
     {% endif %}
     {% endfor %}

.items 将字典转换为(键,值)对列表

更新,你可以用这个替换整个模板,避免上下文变量 p_category

   {% block content %}
   <div class = "container">
   {% for p, values in p_list.items %}
     <div class = "row" >
        ......... {{p}}
        </br>
     </div>
     {% for m in values %}
     <div calss ="row">
      .. <a href = "/pubinfo/{{m.slug}}" > {{m.title}} - [     {{m.created}}] </a>
     </div>
     {% endfor %}
    {% endfor %}
    </div>
  {% endblock %}
相关问题