Viewに複数のmodelを指定する方法 [Django]

Viewに複数のmodelを指定する方法 [Django]


donald chi / 2017-03-11 16:03

音声ファイル作成中...
Audio: Visited: 2829


Djangoでは、html viewを作成する時に、そのページに対応する modelを指定しなければならない。 基本的に一つのページに 一つのmodelを対応するだけで十分だが、今回は、ブログのメインページに blog modelとtag modelを参照に、それぞれリストを表示したいので、 一つのviewに複数のmodelを指定する方法について調べた。


Modelの定義

models.py
class Tag(models.Model):
    name = models.CharField(max_length=255)
    description = MarkdownxField()
    def __str__(self):
        return self.name

class MyBlog(models.Model):
    title = models.CharField(max_length=255)
    body = MarkdownxField()
    tags = models.ManyToManyField(Tag)
    author = models.ForeignKey(User, null=True)
    publishing_date = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField()
    def __str__(self):
        return self.title

今回の目標は、 メインページにblog listとtag listを表示することである。 そのため、viewの定義で、modelを指定する他、get_context_dataから 取得した内容をupdateする必要がある。

Viewの定義

views.py
class BlogListView(ListView):
    model = MyBlog
    template_name = "blog_list.html"
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update({
            'tag_list': Tag.objects.order_by('name'),
            'more_context': Tag.objects.all(),
        })
        blog_list = MyBlog.objects.all().order_by('-publishing_date')[:5]
        return context
    def get_queryset(self):
        return MyBlog.objects.order_by('publishing_date')

上のコードでは、MyBlogから内容をcontextに格納するほか、 Tagからの内容もcontext.updateを通して、格納している。

最後は、templateを使って、表示するだけ。

Templateの定義

blog_list.html  
{% load markdown_deux_tags %}
{% block content %}
<div class="primary col-md-8 col-sm-12 col-xs-12">
    {% for blog in object_list %}
    <section class="about section" id="aboutme">
        <div class="section-inner">
            <h2>{{ blog.title }}</h2>
            <div class="content">
                <font style="color: black;">
                    {{ blog.body|markdown:"STYLE"|safe|escape|truncatechars:300 }}
                </font>
            </div><!--//content-->
            <p><a role="button" href="{% url 'blog_details' slug=blog.slug %}" style="color: blue;">View details 
            <i class="fa fa-angle-double-right" aria-hidden="true"></i></a></p>
        </div><!--//section-inner-->                 
    </section><!--//section-->
    {% endfor %}
</div><!--//primary-->
<div class="secondary col-md-4 col-sm-12 col-xs-12">
    <div class="section-inner">
        <h2>All tag</h2>
        {% for tag in more_context %}
            <div class="content">
                <font style="color: black;">
                    {{ tag }}
                </font>
            </div><!--//content-->
        {% endfor %}
        </div><!--//section-inner-->                
</div><!--//row-->
{% endblock %}

0

0

Share with: Facebook Twitter Google+ LinkedIn Wechat Email Print

Comments: 0 件

There is no Comment now.

Add Comment

Name:
Email:
Comment: