ゆーじぇいブログ

ゆーじぇいブログ

プログラミングとか色々

[Django]検索機能を実装しよう!

f:id:jyouj:20181124164719j:plain

 こちらのブログを全く書いてなくてすみません。今日は運営しているリレー小説サービス"Hundread -みんなでつくる小説投稿"でも取り入れた検索機能について書いていこうと思います。

環境:Django2.1

検索機能

 さてさて、まずはモデルを作っていきます。

class Post(models.Model):
    title = models.CharField(max_length=100)
    article = models.TextField(max_length=10000)
    posted_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-posted_date',]

    def __str__(self):
        return self.title

 次にviews.pyを編集していきます。

from django.db.models import Q

class PostListView(PaginationMixin, generic.ListView):
    template_name = "posts/list.html"
    model = Post

    #Serch
    def get_queryset(self):
        result = super(PostListView, self).get_queryset()
        query = self.request.GET.get('q')

        if query:
            result = Post.objects.filter(Q(title__icontains=query))
        return result

 urls.pyは小細工なしに

path('', views.PostListView.as_view(), name='list'),

 問題はテンプレートですね。と言っても難しいことはしてなくて、

<form class="navbar-item field has-addons" action="{% url "posts:list" %}" method="get" accept-charset="utf-8">
  <div class="control">
    <input class="input" type="text" name="q" placeholder="検索...">
  </div>
  <div class="control">
    <button class="button is-info" type="submit"><span class="icon"><i class="fas fa-search"></i></span></button>
  </div>
</form>

<div class="container">
  {% for post in post_list %}
  <div class="box">
    <article class="media">
      <div class="media-content">
        <div class="content">
          <p>
          <strong>{{ post.title|truncatechars_html:35 }}</strong>
          </p>
        </div>
      </div>
    </article>
  </div>
  {% endfor %}
</div>

 こんな感じでうまくいくと思います。

 何かあればこちらにtwitter(じぇい👨‍💻 (@jyouj__) | Twitter)