【问题标题】:Getting 'text' content from all pages rendered in Django从 Django 中呈现的所有页面获取“文本”内容
【发布时间】:2014-12-11 08:44:37
【问题描述】:

我在 Django 项目中的 URL /about//work/ 有一个页面。每个页面都有导航,需要用top_level_nav=True 显示所有页面。每个页面需要在每个页面上显示text

我已成功获取导航中列出的所有页面,但/about//work/ 页面上的内容显示所有页面中的text

/about/ 应该是:

# nav
-About
–Work

# text
<p>This is the about page.</p>

和 /work/ 应该是:

# nav
-About
–Work

# text
<p>This is the Work page.</p>

但是,/about//work/ 页面都显示为:

#nav
–About
–Work

<p>This is the about page.</p>

<p>This is the Work page.</p>

基本上,所有的文本内容都会显示在所有页面上。

views.py

from django.shortcuts import render, get_object_or_404
from site_2015.models import Page
from site_2015.models import Home    

def home(request):
        home = get_object_or_404(Home)
        # now return the rendered template
        return render(request, 'site_2015/home.html', {'home': home})

def page(request, slug):
        # get the Page object
        pages = Page.objects.filter(top_level_nav=True).order_by('-pub_date')
        page = get_object_or_404(Page, slug=slug)
        # now return the rendered template
        return render(request, 'site_2015/page.html', {'page': pages})
        return render(request, 'site_2015/page.html', {'content': page})

models.py

from django.db import models
from django.core.urlresolvers import reverse


class Home(models.Model):

    title = models.CharField(max_length=200)
    text = models.TextField()
    header_image = models.FileField(upload_to='page/%Y/%m/%d', null=True, blank=True)

    def __unicode__(self):
        return u'%s' % self.title

    def get_absolute_url(self):
        return reverse('site_2015.views.home')


class Page(models.Model):

    title = models.CharField(max_length=200)
    nav_text = models.CharField(max_length=30, null=True, blank=True)
    slug = models.SlugField(unique=True, max_length=255, null=True, blank=True)
    text = models.TextField()
    header_image = models.FileField(upload_to='page/%Y/%m/%d', null=True, blank=True)
    pub_date = models.DateTimeField(null=True, blank=True)
    top_level_nav = models.BooleanField(default=False)

    def __unicode__(self):
        return u'%s' % self.title

    def get_absolute_url(self):
        return reverse('site_2015.views.page', args=[self.slug])


class HomeImg(models.Model):
    home = models.ForeignKey('Home', related_name='images')
    image = models.FileField(upload_to='page/%Y/%m/%d', null=True, blank=True)


class PageImg(models.Model):
    page = models.ForeignKey('Page', related_name='images')
    image = models.FileField(upload_to='page/%Y/%m/%d', null=True, blank=True)

page.html

<nav>
  <ul>
    <li><a href="/">Home</a></li>
    {% for page in page %}
      <li><a href="/{{ page.slug }}">{{ page.nav_text }}</a></li>
    {% endfor %}
  </ul>
</nav>
<div class="content">
  {% for content in page %}
    {{ content.text }}
  {% endfor %}
</div>

我知道我不应该在 context.text 周围设置 for 块,但我不确定该怎么做。

【问题讨论】:

  • 如果你在 manage.py shell 中运行Page.objects.filter(top_level_nav=True).order_by('-pub_date'),你会得到两个文本字段吗?

标签: python django


【解决方案1】:

您的问题是尝试使用两个return 语句:

return render(request, 'site_2015/page.html', {'page': pages})
#The second will not get rendered, and content will not be available
return render(request, 'site_2015/page.html', {'content': page})

相反,您希望将字典作为一个整体呈现

return render(request, 'site_2015/page.html', {'page': pages, 'content' : page })

然后在你的模板中

<div class="content">
  {{ content.text }}
</div>

上下文变量 content 现在将直接在您的模板中可用。

【讨论】:

  • 完美,我担心我解释得不够清楚。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多