「うちの技術書検索くん」を作った話
「うちの技術書検索くん」を作ろう
次は何を作ろうかと思っていたところ、技術書の棚が目に入り、そうだこれを作ってみようと決めました!
では、さっそく図を書こうと思って書いた図がこちら。
実際出来たものとは違うけど、だいたいこんな感じのことがやりたいというイメージが湧いたところで、作業を始める。
必要なものをインストールし、作業開始!
ちなみに、ソースコード全文は ここ(GitHub)
途中の作業の説明ができたらよかったんだけど、上手に説明できない…。どうしよう…、と記事を書きながら思ってるんだけど…大事なところだけ書いてみようと思います。
検索結果を表示する際に使っている部分です。こんな感じに書くと複数ワード検索も対応できるようです。こっちの部分は割と色んな人が記事を書いていてくれたので、参考にしながら実装できましたが…「○○」の検索結果:○件の○の部分の表示で明確な記述をしてくれている記事がなくてなんとか実装したのが、def get_cotent_data(self, *args, **kwargs)以下の部分。多分だけど、contextの定義をして、keywordはこれだよ、countはこれだよとそれぞれ教えてあげた状態でreturnするとHTML上で{{ keyword }}, {{ count }}と記述するとそれぞれ表示してくれる感じでできました…。(語彙力不足)多分、あたりまえの事過ぎてみんな記事にしてないんだろうな…、今回これが実装できて学びになりました。
(詳しいところはソースコード全文を見てください。importとか省略しちゃってるので…。)
<省略>
class IndexView(generic.ListView):
model = Book
template_name = 'searchKunn/index.html'
""" オーバーライド """
def get_queryset(self):
queryset = Book.objects.order_by('-id')
keyword = self.request.GET.get('keyword')
if keyword:
exclusion = set([' ', ' '])
q_list = ''
for i in keyword:
if i in exclusion:
pass
else:
q_list += i
query = reduce(
and_, [Q(Title__icontains=q) | Q(Author__icontains=q) | Q(Category__icontains=q) for q in q_list]
)
queryset = queryset.filter(query)
messages.success(self.request, '「{}」の検索結果'.format(keyword))
return queryset
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
keyword = self.request.GET.get('keyword')
context["keyword"] = keyword
context["count"] = self.get_queryset().count()
return context
<以下略>
まだ3冊しか登録してないので、アレなんですけど実際に作ったものがこちら。
表示周りははじめて「bootstrap」なるものを使用してみました。完全手探りだったのですが、とりあえず形になったので良し。割と簡単にキレイにしてくれるのすごい!と思いました。感動。
もう少し自分がやってることを言語化できるようになりたい
あたまでうーんと考えてることを、とりあえず検索して手を動かしてで実装するのはいいんですけど、あとになって自分のやったことを上手に説明できない感じなのがもやもやします。「ソースコードを見てくれ〜〜〜〜」はそうなんですけど、なんでそこに至ったのか順序よく説明できるまで理解できればDjangoと少しお友達になれるのかな?と思った次第でした!
Discussion