Django模板逻辑

时间:2011-08-10 16:04:41

标签: django templates

所以我现在正在处理Django,

我想要一些比较苛刻的东西。我有一个模型:

class Article(models.Model):
    id = models.IntegerField(primary_key=True)
    volnumber = models.IntegerField(db_column='volNumber')
    title = models.TextField()
    keywords = models.TextField(blank=True)
    start_page = models.IntegerField(null=True, blank=True)
    end_page = models.IntegerField(null=True, blank=True)
    author_1 = models.TextField(blank=True)
    author_2 = models.TextField(blank=True)
    author_3 = models.TextField(blank=True)
    author_4 = models.TextField(blank=True)
    author_5 = models.TextField(blank=True)
    author_6 = models.TextField(blank=True)
    author_7 = models.TextField(blank=True)
    author_8 = models.TextField(blank=True)
    author_9 = models.TextField(blank=True)
    author_10 = models.TextField(blank=True)

在我看来:

def index(request):
    article_list = Article.objects.all()
    volume_list = Volume.objects.all()
    auth_list = ['author_1', 'author_2', 'author_3', 'author_4', 'author_5', 'author_6', 'author_7', 'author_8', 'author_9', 'author_10', ]

    return render_to_response('index.html', {
            'article_list': article_list,
            'volume_list': volume_list,
            'auth_list' : auth_list,
    })

我希望迭代第一篇文章的作者,以及消除模板中列表的空条目:

<ul class="articleList">
    {% for article in article_list %}
        <li>
        {% for author in auth_list %}
            <i>{{ article."author" }}</i>
        {% endfor %}

        {{ article.title }}{{ article }}
        </li>
    {% endfor %}
 </ul>

显然这不起作用,我不确定模板是否适合这种逻辑,但我希望从中可以清楚地知道我想要实现的目标。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:7)

我不确定您是否希望以这种方式设计作者列表。如果您需要多个作者,请考虑为Author使用新模型,然后在Article类中使用ManyToManyField将文章链接到作者。然后,您可以在模板中循环访问作者:

{% for author in article.authors.all %}
    <!-- blah blah -->
{% endfor %}

以下是作者模型:

class Author(models.Model):
    first_name = models.TextField(...) # don't copy to ..., put whatever params you need
    last_name = models.TextField(...)

和调整后的文章模型:

class Article(models.Model):
    # add this line
    authors = models.ManyToManyField(Author)

现在您无需在视图代码中返回auth_list

答案 1 :(得分:0)

如果您不想更改数据模型(尽管我强烈建议您遵循@ andrew-lee建议),则不允许在模板中使用call-by-name属性。你应该这样做:

# in the view
return render_to_response('index.html', {
        'article_list': article_list,
        'volume_list': volume_list,
        'auth_list' : [getattr(article, name) for name in auth_list],
})

# in the template
    {% for author in auth_list %}
        <i>{{ author }}</i>
    {% endfor %}

答案 2 :(得分:0)

在已经说过的基础上,最有意义的是改变你的模型,但是如果你想保持它原样并且只显示已填写的作者字段的列表,你可能会这样做在模板中:

<ul class="articleList">
    {% for article in article_list %}
        <li>
        {% for author in auth_list %}
            {% if author %}
            <i>{{ author }}</i>
            {% endif %}
        {% endfor %}

        {{ article.title }}{{ article }}
        </li>
    {% endfor %}
 </ul>