Djangoでホームページをつくる
https://scrapbox.io/files/62b57f3e7f4feb001d955e22.png
(編集者:なおと)
自分のscrapboxの内容をまとめて(ほぼコピペして)いきます!
ちなみに、python, djangoのバージョンは以下の通りです
python:3.8.3
django:4.0.4
タグ
0. ディレクトリ階層について
最初に、ファイルやフォルダの階層のスクショを載せておきます。適宜ご参照ください。
それと今回はstaticフォルダを全く使わなかったんですけど、使用するときは
code:quiz/index.html
{% static 'quiz/css/style.css' %}
とか書くんだと思います。
https://scrapbox.io/files/62b695e24ef68a001dbd3652.png
1. プロジェクトの作成、アプリケーションの作成
"django-admin startproject 〇〇 " で、プロジェクトを作成する
→今回は、" django-admin startproject django_app "にします
一応、" python manage.py runserver "でサーバーが動くかどうか確認。
→ロケット飛んだのでヨシ!
" python manage.py startapp 〇〇 " で、アプリケーションを作成する
→今回は quiz とかにします。problems とかに比べたらわかりやすい。
https://scrapbox.io/files/62a0275b81b295001d9384cf.png
できてますね。安心だ〜
2. quizにurls.pyを作成する
「アプリケーションのアドレスは、それぞれのアプリケーションで管理できるようにする」ために、quiz内にurls.pyを作成し、quiz内でquizのurlを管理する
urls.pyを作成したら、以下の内容を書き込む
code:quiz/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
今回の場合、django_app/urls.py も修正しないと開かないンゴ
code:django_app/urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('quiz/', include('quiz.urls')), #こいつを加える ]
path('quiz/', include('quiz.urls')) を指定することで、quizフォルダ内のurls.pyが読み込まれ、'quiz/'に割り当てられるようになる
3. テンプレートを利用できるようにする
アプリケーションを登録する
→settings.py を修正する
code:django_app/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
こうすることで、「Djangoのテンプレート機能がquizを検索」できるようになる
テンプレートフォルダを作成する
→ django_app/quiz/templates/quiz の順に、フォルダを作成する。
テンプレートを作成する
→ django_app/quiz/templates/quiz の中に、index.htmlファイルを作成する。
code:quiz/templates/quiz/index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet"
</head>
<h1 class="display-4 text-primary mb-4">{{title}}</h1>
<p class="h5">{{msg}}</p>
<p class="h6"><a href="{% url goto %}">{{goto}}</a></p>
#{% %}はテンプレートを使用するためのタグ。{% url ... %} の ... に urlpatterns で指定した名前(name)を入れることで、そのパスを使用することができる! </body>
</html>
{{title}}、{{msg}}、{{goto}}は次の views.py で内容を指定する
code:quiz/views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
params = {
'title':'quiz/Index',
'msg':'これは、サンプルで作ったページです。',
'goto':'next',
}
return render(request, 'quiz/index.html', params)
def next(request):
params = {
'title':'quiz/Next',
'msg':'これは、もう1つのページです。',
'goto':'index',
}
return render(request, 'quiz/index.html', params)
そして、urls.py で next を指定する
code:quiz/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('next', views.next, name='next'),
]
静的ファイルを利用できるようにする
→ django_app/quiz/static/quiz の順にフォルダを作成する。状況次第で、 quiz フォルダの中にcssファイルや画像ファイルを入れる(一応今回は、style.css を入れた想定)
code:quiz/static/quiz/style.css
body {
color:gray;
font-size:16pt;
}
h1 {
color:red;
opacity:0.2;
font-size:60pt;
margin-top:-20px;
margin-bottom:0px;
text-align:right;
}
p {
margin:10px;
}
a {
color:blue;
text-decoration: none;
}
一応、staticの内のファイルをhtmlファイルに反映させるなら、htmlのheadタグを以下のように修正
code:quiz/templates/quiz/index.html
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet" type="text/css"
href="{% static 'quiz/css/style.css' %}" />
#{% static '〇〇' %}の形で、静的ファイルのURLを作成する。ファイルを使用するためには、staticフォルダ内のパスを指定する必要がある。今回の場合、〇〇に「quiz/css/style.css」を指定。 </head>
4. フォームで送信できるようにする
フォーム機能を実装!
quizファイルにforms.pyを作成
forms.pyに以下の内容を記述
code:quiz/forms.py
from django import forms
class QuizForm(forms.Form):
name = forms.CharField(label='name')
price = forms.IntegerField(label='price')
comment = forms.CharField(label='comment')
※Formクラスは、form.Formクラスを継承(あるクラスを定義する際に親となるクラスを指定し、そのクラスの機能をまるごと引き継ぐこと)して作成する
※CharFieldはテキストを、IntegerFieldは整数を入力するためのフィールドクラス
ビュー関数を定義する
code:quiz/views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
params = {
'title': '問題集共有サイト',
'message': '問題集を共有せよ:',
'form': QuizForm()
}
'<br>価格:' + request.POST'price' + \ params'form' = QuizForm(request.POST) return render(request, 'quiz/index.html', params)
index.htmlファイルの<body>タグ内を編集する
code:templates/quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p class="h5 mt-4">{{message|safe}}</p>
{% comment %} |safe をつけることで、HTMLタグをそのままタグとして書き出せる {% endcomment %}
<form action="{% url 'index' %}" method="post">
{% csrf_token %}
{{ form }}
{% comment %} {{ form }}だけで大丈夫。便利! {% endcomment %}
<input type="submit" value="click">
{% comment %} 送信ボタン {% endcomment %}
</form>
</body>
デフォルトだと横一列で見づらいため、縦一列に表示するように、htmlファイルを編集する
code:templates/quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p class="h5 mt-4">{{message|safe}}</p>
<form action="{% url 'index' %}" method="post">
{% csrf_token %}
{% comment %} ここから {% endcomment %}
<table>
{{ form.as_table }}
{% comment %} .as_tableでテーブルにまとめる {% endcomment %}
<tr><td></td><td>
<input type="submit" value="click">
</td></tr>
</table>
{% comment %} ここまで {% endcomment %}
</form>
</body>
formクラスで Bootstrapが使えるようにするために、forms.py を変更
code:quiz/forms.py
class QuizForm(forms.Form):
name = forms.CharField(label='name', \
widget=forms.TextInput(attrs={'class':'form-control'}))
price = forms.IntegerField(label='price', \
widget=forms.TextInput(attrs={'class':'form-control'}))
comment = forms.CharField(label='comment', \
widget=forms.NumberInput(attrs={'class':'form-control'}))
#TextInputは <input type="text">のウィジェット、NumberInputは <input type="number">のウィジェット そして、htmlファイルを変更
code:templates/quiz/index.html
<form action="{% url 'index' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" class="btn btn-primary my-2"
value="click">
</form>
結構スッキリしたわね
☆いろんな機能を実装するなら、HTMLタグでForm作るより、Formクラスで実装した方が吉
◎ちょいと応用編
ビュー関数をクラス化し、GETアクセス時とPOSTアクセス時の操作を規定する
code:quiz/views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import TemplateView
from .forms import QuizForm
class QuizView(TemplateView):
self.params = {
'title': 'Hello',
'message': 'your data:',
'form': QuizForm()
}
return render(request, 'quiz/index.html', self.params)
msg = '問題集は、<b>' + request.POST'name' + \ ')</b>です。<br>コメントは <b>' + request.POST'comment' + \ '</b> ですね。'
self.params'form' = QuizForm(request.POST) return render(request, 'quiz/index.html', self.params)
そして、urlpatternsを修正する
code:quiz/urls.py
from django.urls import path
from .views import QuizView
urlpatterns = [
path(r'', QuizView.as_view(), name='index'),
]
5. さまざまなフィールドを使えるようにする
保留!必要になった時にまた参照します
6. 管理ツールでデータベースを作成する
Djangoにはデータベースの一種である「SQLite」が標準搭載されている。嬉しい!
まず初めに、テーブルを設計する。後々修正するのは大変なので、最初にきっちり決めておこう!今回はこう
名前|問題集の名前を保管する。テキスト値。
価格|問題集の価格を保管する。整数値。
日付|問題集の出版日を保管する。日付の値。
コメント|問題集についての補足を保管する。テキスト値。
モデルを利用して、テーブルを定義する。テーブルの作成がいらない点が、Django特有かと。
code:quiz/models.py
from django.db import models
class Quiz(models.Model):
name = models.CharField(max_length=100)
price = models.IntegerField(default=0)
data = models.DateField()
comment = models.CharField(max_length=200)
return '<Quiz:id=' + str(self.id) + ', ' + \
self.name + '(' + str(self.price) + ')>'
マイレグレーション(データベースの移行)を行う。
ターミナル上で、以下の二つのコードを実行
code:terminal
python manage.py makemigrations quiz
python manage.py migrate
7. 管理ツールを使おう
管理ツールを使って、ダミーのデータを作るぞ!(テスト用とかで使えそうなやつ)
管理者登録をする。ターミナルで以下のコマンドをタイプ
code:terminal
python manage.py createsuperuser
そすると、ユーザ名(admin)・めあど(t.........@..........)・パスワード(..o....)を求められるから、入力してく
Quizモデルを管理ツールで利用できるように登録してく
code:quiz/admin.py
from django.contrib import admin
from .models import Quiz
https://scrapbox.io/files/62ac35c10a868200236da5c7.png
※1つのレコードを扱うのか、はたまた複数のレコードを扱うのかによって、単数と複数が異なってくるぞい
https://scrapbox.io/files/62ac36980a868200236dbb12.png
quizsに入った後。もちろん、何にもデータは入ってないので、右上の「ADD QUIZ+」から仮のレコードを登録する。
https://scrapbox.io/files/62ac37c8f13867001e8a084a.png
登録後。ちゃんと表示されてますね。
次に、利用者を登録する。Home > Users > ADD USER からユーザを登録する。 → 登録できた!
8. レコードを取得する
レコードを表示する
views.py を編集する
code:quiz/views.py
from django.shortcuts import render
from .models import Quiz
def index(request):
params = {
'title': 'Hello',
'message': '問題集',
'data': data,
}
return render(request, 'quiz/index.html', params)
index.htmlを修正し、レコードを表示する
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p class="h5 mt-4">{{message|safe}}</p>
<table class="table">
<tr>
<th>ID</th>
<th>NAME</th>
<th>PRICE</th>
<th>DATA</th>
<th>COMMENT</th>
</tr>
{% for item in data %}
{% comment %} forタグを用いて変数dataから多数のデータを取り出し、itemに代入する。 {% endcomment %}
<tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>{{item.data}}</td>
<td>{{item.comment}}</td>
<tr>
{% endfor %}
{% comment %} forタグの終了地点 {% endcomment %}
</table>
</body>
モデルを表示させるため、urls.pyを編集する
code:quiz/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
https://scrapbox.io/files/62af1263f525f7002393b07e.png
ちゃんと表示されてる。えらい(?)
指定のIDのレコードだけを取り出せるようにする
forms.pyを修正する
code:quiz/forms.py
class QuizForm(forms.Form):
id = forms.IntegerField(label='ID')
そして、index.htmlを修正する
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p class="h5 mt-4">{{message|safe}}</p>
{% comment %} ここから {% endcomment %}
<form action="{% url 'index' %}" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="click">
</form>
{% comment %} ここまでを追加 {% endcomment %}
<table class="table">
<tr>
<th>ID</th>
<th>NAME</th>
<th>PRICE</th>
<th>DATA</th>
<th>COMMENT</th>
</tr>
{% for item in data %}
<tr>
<td>{{item.id}}</td>
<td>{{item.name}}</td>
<td>{{item.price}}</td>
<td>{{item.data}}</td>
<td>{{item.comment}}</td>
<tr>
{% endfor %}
</table>
</body>
そしてviews.pyを編集
code:quiz/views.py
from django.shortcuts import render
from .models import Quiz
from .forms import QuizForm
def index(request):
data = Quiz.objects.all()
params = {
'title': 'Hello',
'message': '問題集',
'form':QuizForm(),
'data': [],
}
if (request.method == 'POST'):
item = Quiz.objects.get(id=num)
params'form' = QuizForm(request.POST) else:
params'data' = Quiz.objects.all() return render(request, 'quiz/index.html', params)
ちょっと、理解が怪しくなってきたな...
※メソッドチェーンを使いこなせれば複雑な操作も書けるようになるっぽ( Quiz.objects.all().values() みたいな書き方のこと)
※ Quiz.objects.all().values() において、valuesメソッドの引数に項目名を書いておくと、その項目の値だけ取り出せる(例:Quiz.objects.all().values('id', 'name') )
※レコードを取得する手法には、最初だけ取るものや最後だけ取るもの、また個数を数えるものがある
code:quiz/views.py
from ast import Num
from django.shortcuts import render
from .models import Quiz
from .forms import QuizForm
def index(request):
params = {
'title': 'Hello',
'data': data,
}
return render(request, 'quiz/index.html', params)
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p class="h5 mt-4">{{message|safe}}</p>
<form action="{% url 'index' %}" method="post">
<table class="table">
<tr>
<th>DATA</th>
</tr>
{% for item in data %}
<tr>
<td>{{item}}</td>
<tr>
{% endfor %}
</table>
</body>
https://scrapbox.io/files/62af1bbbfd4e8a00210c14d3.png
項目数、最初のレコード、最後のレコードだけ表示
Querysetの機能を書き換える。
code:quiz/views.py
from ast import Num
from django.shortcuts import render
from .models import Quiz
from django.db.models import QuerySet
def __new_str__(self):
result = ''
for item in self:
result += '<tr>'
for k in item:
result += '<td>' + str(k) + '=' + str(itemk) + '</td>' result += '</tr>'
return result
QuerySet.__str__ = __new_str__
def index(request):
data = Quiz.objects.all().values('id', 'name', 'price')
params = {
'title': 'Hello',
'data': data,
}
return render(request, 'quiz/index.html', params)
index.htmlで表示できるようにするぞ
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<table class="table">
{{data|safe}}
</table>
</body>
これだけの内容で、
https://scrapbox.io/files/62b1103cf1b845001e945436.png
ちゃんと表示が出る。すごい(小並感)
9. CRUDを作る
データベースを利用していく上で基本となる、「CRUD」を構築していく。
※CRUD ... Create, Read, Update, Delete
C(Create)を実装する
モデルインスタンスを用意し、保存メソッド(今回は save を使用)を実行する
フォームを作成
code:quiz/forms.py
from django import forms
class QuizForm(forms.Form):
name = forms.CharField(label='Name', \
widget=forms.TextInput(attrs={'class':'form-control'}))
price = forms.IntegerField(label='Price', \
widget=forms.NumberInput(attrs={'class':'form-control'}))
data = forms.DateField(label='Data', \
widget=forms.DateInput(attrs={'class':'form-control'}))
comment = forms.CharField(label='Comment', \
widget=forms.TextInput(attrs={'class':'form-control'}))
C(create)専用のhtmlファイルを作成
code:quiz/create.html
{% load static %}
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet"
crossorigin="anonymous">
</head>
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<form action="{% url 'create' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="click" class="btn btn-primary mt-2">
</form>
</body>
</html>
form専用のhtmlファイルみたいっすね
ついでに、createからのデータを表示するよう、index.htmlも変更
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<table class="table">
<tr>
<th>data</th>
</tr>
{% for item in data %}
<tr>
<td>{{item}}</td>
<tr>
{% endfor %}
</table>
</body>
そして、viewsを変更
code:quiz/views.py
from xml.etree.ElementTree import Comment
from django.shortcuts import render, redirect
from .models import Quiz
from .forms import QuizForm
def index(request):
data = Quiz.objects.all()
params = {
'title': 'Hello',
'data': data,
}
return render(request, 'quiz/index.html', params)
# create model
def create(request):
params = {
'title': 'Hello',
'form': QuizForm(),
}
return render(request, 'quiz/create.html', params)
最後に、urls.pyを修正
code:quiz/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('create', views.create, name='create'),
]
https://scrapbox.io/files/62b11813c1f810001d7a6f26.png
OKそう。フォームに何か記入すると、
https://scrapbox.io/files/62b1184c1e0f430022b782dd.png
index.htmlにちゃんと戻ってきますね。
ModelFormを使う
前回の方法よりもスムーズにレコードを保存できるようにしていくぞい
forms.pyを修正
code:quiz/forms.py
from django import forms
from .models import Quiz
class QuizForm(forms.ModelForm):
model = Quiz
create関数を修正する
code:quiz/views.py
def create(request):
quiz = QuizForm(request.POST, instance=obj)
params = {
'title': 'Hello',
'form': QuizForm(),
}
return render(request, 'quiz/create.html', params)
create.htmlも修正
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<form action="{% url 'create' %}" method="post">
{% csrf_token %}
<table class="table">
{% comment %} tableタグを使って整形する {% endcomment %}
{{ form.as_p }}
<tr><th><td>
<input type="submit" value="click" class="btn btn-primary mt-2">
</tr></th></td>
</table>
</form>
</body>
https://scrapbox.io/files/62b2897e8344d20023336ad0.png
本の表示とちょっと違うけど、ひとまず保留でいいか。
Updateを実装
◯「あらかじめ、更新するレコードのモデルを用意しておく」
◯編集用のQuizインスタンスを作成する
urls.pyを修正
code:quiz/urls.py
urlpatterns = [
path('', views.index, name='index'),
path('create', views.create, name='create'),
]
index.htmlも修正
code:quiz/index.html
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<table class="table">
<tr>
<th>data</th>
</tr>
{% for item in data %}
<tr>
<td>{{item}}</td>
<td><a href="{% url 'edit' item.id %}">Edit</a></td>
{% comment %} ここの一文を追加。edit/id番号に飛べるようにする {% endcomment %}
<tr>
{% endfor %}
</table>
</body>
edit.htmlを作成する
code:quiz/edit.html
{% load static %}
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet"
crossorigin="anonymous">
</head>
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<form action="{% url 'edit' id %}" method="post">
{% comment %} ここの一文だけ、create.htmlと異なる {% endcomment %}
{% csrf_token %}
<table class="table">
{{ form.as_table }}
<tr><th><td>
<input type="submit" value="click" class="btn btn-primary mt-2">
</td></th></tr>
</table>
</form>
</body>
</html>
views.pyを編集し、edit関数を作成する
code:quiz/views.py
if (request.method == 'POST'):
return redirect(to='/quiz')
params = {
'title': 'Hello',
'id':num,
'form': QuizForm(instance=obj),
}
return render(request, 'quiz/edit.html', params)
コードの内容はほぼcreate関数と同じ。
Deleteを作成する
◯DeleteもUpdateと非常に似ているらし
urls.py と index.html を編集。編集内容はuptateとほぼ同じ。
delete.htmlを作成する
code:quiz/delete.html
{% load static %}
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet"
crossorigin="anonymous">
</head>
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p>※以下のレコードを削除します。</p>
<table class="table">
<tr><th>ID</th><td>{{obj.id}}</td></tr>
<tr><th>Name</th><td>{{obj.name}}</td></tr>
<tr><th>Price</th><td>{{obj.price}}</td></tr>
<tr><th>Data</th><td>{{obj.data}}</td></tr>
<tr><th>Comment</th><td>{{obj.comment}}</td></tr>
{% comment %} formはじまり。 {% endcomment %}
<form action="{% url 'delete' id %}" method="post">
{% csrf_token %}
<tr><th></th><td>
<input type="submit" value="click" class="btn btn-primary">
</td></tr>
</form>
{% comment %} formおわり。機能としては、{% csrf_token %}と<input type="submit">だけ。 {% endcomment %}
</table>
</body>
</html>
delete関数を作る
code:quiz/views.py
def delete(request, num):
quiz = Quiz.objects.get(id=num)
if (request.method == 'POST'):
return redirect(to='/quiz')
params = {
'title': 'Hello',
'id':num,
'obj': quiz,
}
https://scrapbox.io/files/62b29b1844a5a6001d98f00f.png
deleteまで実装。
https://scrapbox.io/files/62b29b2026d3260023c23924.png
deleteを押すと、この画面に遷移。下のclickを押すと...
https://scrapbox.io/files/62b29b28f15985001de7b023.png
レコードが削除される(※id=4のレコードは1枚目と2枚目の間に消しました。すみません!)
ジェネリックビューを実装する
保留!時間があれば実装します。
10. 検索機能を実装する
レコードを検索できるようにする
検索とフィルター
Managerクラスのインスタンスを用いて、フィルター機能を利用する
urls.pyを編集
code:quiz/urls.py
urlpatterns = [
... 略 ...
]
forms.pyを編集
code:quiz/forms.py
class FindForm(forms.Form):
find = forms.CharField(label='Find', required=False, \
find.htmlを作成
code:quiz/find.html
{% load static %}
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>{{title}}</title>
<link rel="stylesheet"
crossorigin="anonymous">
</head>
<body class="container">
<h1 class="display-4 text-primary">{{title}}</h1>
<p>{{message|safe}}</p>
<form action="{% url 'find' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<tr><th></th><td>
<input type="submit" value="click"class="btn btn-primary mt-2">
</td></tr>
</form>
<hr>
<table class="table">
<tr>
<th>id</th>
<th>name</th>
<th>data</th>
<th>comment</th>
</tr>
{% for item in data %}
<tr>
<th>{{item.id}}</th>
<td>{{item.name}}({{item.price}})</td>
<td>{{item.data}}</td>
<td>{{item.comment}}</td>
<tr>
{% endfor %}
</table>
</body>
</html>
find関数を定義
code:quiz/views.py
def find(request):
if (request.method == 'POST'):
form = FindForm(request.POST)
msg = 'Result: ' + str(data.count())
else:
msg = 'search words...'
form = FindForm()
data =Quiz.objects.all()
params = {
'title': 'Hello',
'message': msg,
'form':form,
'data':data,
}
return render(request, 'quiz/find.html', params)
https://scrapbox.io/files/62b2a5168e6d8b001dd4528b.png
これでひとまず、実装は完了。
あいまい検索
上記のコードだと、完全一致するものしか検索できない。
→あいまい検索(クエリーに内容を含むものが全て検索される機能)を実装しよう!
至ってシンプル。views.pyの1行を変更するだけ。
code:quiz/views.py
※このほかにも、__startswithや__endswithなども存在する
大文字や小文字を区別しないようにする
大文字小文字を区別しない、あいまい検索を可能にする
→ name__contains を name_icontains にするだけ(iを入れるだけ)!
数値の比較
数値の大小を比較する
...__gt(値よりも大きい), __gte(値と等しいか大きい), __lt(値よりも小さい), __lte(値と等しいか小さい)
※引数をintにブロードすることを忘れずに!
◯円以上、◯円以下を表現する
AND検索を実装
code:quiz/views.py
if (request.method == 'POST'):
form = FindForm(request.POST)
data = Quiz.objects \
.filter(price__gte=val0) \ msg = 'Result: ' + str(data.count()
... あとは同じ ...
条件Aと条件Bをどっちも検索する
OR検索を実装
code:quiz/views.py
from django.db.models import Q
data = Quiz.objects.filter( Q(name__icontains=find) | Q(comment__icontains=find) )
リストを使って検索する
書いた名前を全て検索する
例のごとく、views.pyを編集する
code:quiz/views.py
list = find.split()
data = Quiz.objects.filter( name__in=list )
https://scrapbox.io/files/62b2a5168e6d8b001dd4528b.png
試してみる。
https://scrapbox.io/files/62b2aef4c1ab68001e1b5016.png
クエリーの内容が検索された(これ部分一致じゃないのね)