質問するログイン新規登録

質問編集履歴

1

問題点の変更

2020/12/22 04:26

投稿

fdd
fdd

スコア28

title CHANGED
@@ -1,1 +1,1 @@
1
- Django Integerfieldのフィルター(検索)方法がわからな
1
+ ChoiceFieldでvaluesを文字として返した
body CHANGED
@@ -1,179 +1,20 @@
1
- ### 実現内容、問題点
1
+ ### 問題点
2
+ choicesのvaluesを検索文字として使用しようとしているためChoiceの値を文字にしています。しかしchoiceの値が指定した順番の数値として表示されます。
3
+  (例)ramentaste =塩  values = 2
4
+ 下記のサイトを参考にしたのですが理由がわかりません。
5
+ ご教授のほどお願いします。
2
6
 
3
- 内容としては、ラーメンの味を検索テキストに入力することで該当する項目を出力しようとしています。
4
- 問題点としてcharafieldで作成したモデルの検索方法の仕方はわかるのですが、IntegerFieldで作成したモデルに対して検索をかける方法がわからず、詰まっています。
7
+ [https://qiita.com/mkizka/items/e1011aadbd1b22aca92d](https://qiita.com/mkizka/items/e1011aadbd1b22aca92d)
5
8
 
6
- Qフィルターをどのようにコードを組むことで数値でラベル化してある文字の値を検索対象として実行できるのでしょうか。
7
9
 
8
- ご教授のほどお願いいたします。
10
+ ### イメージ画像
11
+ ![イメージ説明](9a86a8b9e7b2209ab938169f16744915.png)
9
12
 
13
+ ### ソースコード
10
14
  ```python
11
- #views.py
12
15
 
13
- from django.contrib.auth.mixins import LoginRequiredMixin
14
- from django.http import HttpResponseRedirect
15
- from django.urls import reverse_lazy
16
- from django.utils import timezone
17
- from django.views.generic import DetailView
18
- from django.views.generic.edit import CreateView, UpdateView, DeleteView
19
- from django_filters.views import FilterView
20
- from django.db.models import Q
16
+ models.py
21
17
 
22
- from .filters import ItemFilterSet
23
- from .forms import ItemForm
24
- from .models import Item
25
-
26
-
27
- # 未ログインのユーザーにアクセスを許可する場合は、LoginRequiredMixinを継承から外してください。
28
- #
29
- # LoginRequiredMixin:未ログインのユーザーをログイン画面に誘導するMixin
30
- # 参考:https://docs.djangoproject.com/ja/2.1/topics/auth/default/#the-loginrequired-mixin
31
-
32
- class ItemFilterView(LoginRequiredMixin, FilterView):
33
- """
34
- ビュー:一覧表示画面
35
- 以下のパッケージを使用
36
- ・django-filter 一覧画面(ListView)に検索機能を追加
37
- https://django-filter.readthedocs.io/en/master/
38
- """
39
- model = Item
40
-
41
- # django-filter 設定
42
- filterset_class = ItemFilterSet
43
- # django-filter ver2.0対応 クエリ未設定時に全件表示する設定
44
- strict = False
45
-
46
- # 1ページの表示
47
- paginate_by = 10
48
-
49
- def get(self, request, **kwargs):
50
- """
51
- リクエスト受付
52
- セッション変数の管理:一覧画面と詳細画面間の移動時に検索条件が維持されるようにする。
53
- """
54
-
55
- # 一覧画面内の遷移(GETクエリがある)ならクエリを保存する
56
- if request.GET:
57
- request.session['query'] = request.GET
58
- # 詳細画面・登録画面からの遷移(GETクエリはない)ならクエリを復元する
59
- else:
60
- request.GET = request.GET.copy()
61
- if 'query' in request.session.keys():
62
- for key in request.session['query'].keys():
63
- request.GET[key] = request.session['query'][key]
64
-
65
- return super().get(request, **kwargs)
66
-
67
- def get_queryset(self):
68
- q_word = self.request.GET.get('query')
69
-
70
- FILTER_CHOICES = (
71
- ('1', '醤油'),
72
- ('2', '塩'),
73
- ('3', '豚骨'),
74
- ('4', '味噌'),
75
- ('5', '鶏白湯'),
76
- ('6', 'つけ麺'),
77
- ('7', '担々麺'),
78
- ('8', '油そば'),
79
- )
80
-
81
- #フィルタ検索部分
82
- Item.objects.ChoiceField(Q(sample_1 = 1) | Q(sample_1 = 2) | Q(sample_1 = 3)|
83
- Q(sample_1 = 4) | Q(sample_1 = 5) | Q(sample_1 = 6) | Q(sample_1 = 7) | Q(sample_1 = 8))
84
-
85
-
86
-
87
-
88
-
89
-
90
- def get_context_data(self, *, object_list=None, **kwargs):
91
- """
92
- 表示データの設定
93
- """
94
- # 表示データを追加したい場合は、ここでキーを追加しテンプレート上で表示する
95
- # 例:kwargs['sample'] = 'sample'
96
- return super().get_context_data(object_list=object_list, **kwargs)
97
-
98
-
99
- class ItemDetailView(LoginRequiredMixin, DetailView):
100
- """
101
- ビュー:詳細画面
102
- """
103
- model = Item
104
-
105
- def get_context_data(self, **kwargs):
106
- """
107
- 表示データの設定
108
- """
109
- # 表示データの追加はここで 例:
110
- # kwargs['sample'] = 'sample'
111
- return super().get_context_data(**kwargs)
112
-
113
-
114
- class ItemCreateView(LoginRequiredMixin, CreateView):
115
- """
116
- ビュー:登録画面
117
- """
118
- model = Item
119
- form_class = ItemForm
120
- success_url = reverse_lazy('index')
121
-
122
- def form_valid(self, form):
123
- """
124
- 登録処理
125
- """
126
- item = form.save(commit=False)
127
- item.created_by = self.request.user
128
- item.created_at = timezone.now()
129
- item.updated_by = self.request.user
130
- item.updated_at = timezone.now()
131
- item.save()
132
-
133
- return HttpResponseRedirect(self.success_url)
134
-
135
-
136
- class ItemUpdateView(LoginRequiredMixin, UpdateView):
137
- """
138
- ビュー:更新画面
139
- """
140
- model = Item
141
- form_class = ItemForm
142
- success_url = reverse_lazy('index')
143
-
144
- def form_valid(self, form):
145
- """
146
- 更新処理
147
- """
148
- item = form.save(commit=False)
149
- item.updated_by = self.request.user
150
- item.updated_at = timezone.now()
151
- item.save()
152
-
153
- return HttpResponseRedirect(self.success_url)
154
-
155
-
156
- class ItemDeleteView(LoginRequiredMixin, DeleteView):
157
- """
158
- ビュー:削除画面
159
- """
160
- model = Item
161
- success_url = reverse_lazy('index')
162
-
163
- def delete(self, request, *args, **kwargs):
164
- """
165
- 削除処理
166
- """
167
- item = self.get_object()
168
- item.delete()
169
-
170
- return HttpResponseRedirect(self.success_url)
171
-
172
- ``````
173
-
174
- ```python
175
- #models.py
176
-
177
18
  from django.db import models
178
19
  from django.contrib.admin.widgets import AdminDateWidget
179
20
  from django import forms
@@ -221,18 +62,18 @@
221
62
 
222
63
 
223
64
  ramen_taste = (
224
- (1, '醤油'),
65
+ ('醤油', '醤油'),
225
- (2, '塩'),
66
+ ('塩', '塩'),
226
- (3, '豚骨'),
67
+ ('豚骨', '豚骨'),
227
- (4, '味噌'),
68
+ ('味噌', '味噌'),
228
- (5, '鶏白湯'),
69
+ ('鶏白湯', '鶏白湯'),
229
- (6, 'つけ麺'),
70
+ ('つけ麺', 'つけ麺'),
230
- (7, '担々麺'),
71
+ ('担々麺', '担々麺'),
231
- (8, '油そば'),
72
+ ('油そば', '油そば'),
232
73
  )
233
74
 
234
75
  # サンプル項目1 ラーメンの味
235
- sample_1 = models.IntegerField(
76
+ sample_1 = models.TextField(
236
77
  verbose_name='ラーメンジャンル',
237
78
  choices=ramen_taste,
238
79
  blank=True,
@@ -383,6 +224,122 @@
383
224
  verbose_name = '検索'
384
225
  verbose_name_plural = '検索'
385
226
 
227
+ ```
386
228
 
229
+ ```html
230
+ #form.html
231
+ <form method="post" enctype="multipart/form-data">
232
+ {% extends "./_base.html" %}
233
+ {% block content %}
234
+ {% load crispy_forms_tags %}
235
+ <div class="container">
236
+ <div id="myModal" class="modal fade" tabindex="-1" role="dialog">
237
+ <div class="modal-dialog" role="document">
238
+ <div class="modal-content">
239
+ <div class="modal-header">
240
+ <h5 class="modal-title">検索条件</h5>
241
+ <button type="button" class="close" data-dismiss="modal" aria-label="閉じる">
242
+ <span aria-hidden="true">&times;</span>
243
+ </button>
244
+ </div>
245
+ <form id="filter" method="get">
246
+ <div class="modal-body">
247
+ {{ filter.form|crispy }}
248
+ </div>
249
+ </form>
250
+ <div class="modal-footer">
251
+ <a class="btn btn-outline-dark" data-dismiss="modal">戻る</a>
387
252
 
253
+ <button type="submit" class="btn btn-outline-dark" form="filter">検索</button>
254
+ </div>
255
+ </div>
256
+ </div>
257
+ </div>
258
+ <div class="row">
259
+ <div class="col-12">
260
+ <a class="btn btn-secondary filtered" style="visibility:hidden" href="/?page=1">検索を解除</a>
261
+ <div class="float-right mt-1">
262
+ <a class="btn btn-outline-dark" href="{% url 'create' %}">新規</a>
263
+
264
+ <form action=""method="get">
265
+ <input name="query" value="{{ request.GET.query }}" type="text">
266
+ <button type="submit">検索する</button>
267
+ </form>
268
+
269
+
270
+ </div>
271
+ </div>
272
+ </div>
273
+
274
+ <div class="row mt-3">
275
+ <div class="col-10 mx-auto">
276
+ {% include "./_pagination.html" %}
277
+ </div>
278
+ </div>
279
+
280
+ <div class="row">
281
+ <div class="col-12">
282
+ <ul class="list-group">
283
+ {% if item_list %}
284
+ {% for item in item_list %}
285
+ <li class="list-group-item">
286
+ {# item_detail_contents.html を参考に必要な項目を追加してください #}
287
+
288
+ <div class="row">
289
+ <div class="col-5 col-sm-3">
290
+ <p>1_ラーメン店</p>
291
+ </div>
292
+ <div class="col-7 col-sm-9">
293
+ <p>{{ item.name | default_if_none:"未入力" }}</p>
294
+ </div>
295
+ </div>
296
+
297
+ <div class="row">
298
+ <div class="col-5 col-sm-3">
299
+ <p>2_メニュー名称</p>
300
+ </div>
301
+ <div class="col-7 col-sm-9">
302
+ <p>{{ item.get_sample_1_display | default_if_none:"未入力" }}</p>
303
+ </div>
304
+ </div>
305
+
306
+ <div class="row">
307
+ <div class="col-5 col-sm-3">
308
+ <p>3_都道府県</p>
309
+ </div>
310
+ <div class="col-7 col-sm-9">
311
+ <p>{{ item.name2 | default_if_none:"未入力" }}</p>
312
+ </div>
313
+ </div>
314
+
315
+ <div class="row">
316
+ <div class="col-5 col-sm-3">
317
+ <p>4_市区町村</p>
318
+ </div>
319
+ <div class="col-7 col-sm-9">
320
+ <p>{{ item.name3 | default_if_none:"未入力" }}</p>
321
+ </div>
322
+ </div>
323
+
324
+ <div class="row">
325
+ <div class="col-5 col-sm-3">
326
+ <p>5_スープ味</p>
327
+ </div>
328
+ <div class="col-7 col-sm-9">
329
+ <p>{{ item.get_sample_1 | default_if_none:"未入力" }}</p>
330
+ </div>
331
+ </div>
332
+
333
+ <div class="row">
334
+ <div class="col-12">
335
+ <div class="float-right mt-1 mb-3">
336
+ <a class="btn btn-outline-dark" href="{% url 'create' %}">新規</a>
337
+ <a class="btn btn-outline-dark" data-toggle="modal" data-target="#myModal" href="#">検索</a>
338
+ </div>
339
+ </div>
340
+ </div>
341
+ </div>
342
+ {% endblock %}
343
+ </form>
344
+
388
345
  ```