質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1412閲覧

Dajango2.2で検索クエリをurlに引き継ぎたい。

Spacekoki

総合スコア17

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/05 13:07

編集2020/01/05 14:03

djangoで検索アプリケーションを作成しています。
この記事を参考に作りました。
また,記事への評価を記録するFeedbackモデルを追加しました。
検索をし,検索結果を表示させた後,記事をクリックすると詳細画面に移行するようにしています。
詳細画面にてフィードバックを入力して送信ボタンを押した後に検索式(クエリ)をモデルに保存したいのですが,どうすればよいのでしょうか。クエリをurlに持たせてそれを読み込むのがよいのかなと持っていますが,実装方法がわかりません。また,urlに持たせる以外のの実装方法があるなら教えていただけると幸いです。
イメージとしてはportal/search/?q=検索ワードみたいな感じ。
また,詳細画面から戻ったときに前の検索結果を表示させたいのですが,実装方法を教えていたけると幸いです。
どちらかでもわかった方がいらっしゃいましたら回答して抱変えると嬉しいです。
何か質問がありましたらコメントをください。

以下,models.py,views.py,urls.py
models.py

from django.db import models from django.urls import reverse from taggit.managers import TaggableManager class KnowHow(models.Model): BASIC_TAGS =( ('1','資料作成(スライド・ポスター)'), ('2','資料作成(論文・要旨)'), ('3','開発'), ('4','実験・考察'), ('5','用語の定義・説明'), ('6','プレゼンテーション'), ) CATEGORY =( ('1','暗黙的ノウハウ'), ('2','形式的ノウハウ'), ) author = models.ForeignKey('auth.User',on_delete=models.CASCADE) category = models.CharField(max_length=1,choices=CATEGORY,default='1') title = models.CharField(max_length=200) text = models.TextField(blank=True,default=' ') # delault=' ':import system will give a error if text column is null file = models.FileField(blank=True,upload_to='explicit_knowhows') basic_tag = models.CharField(max_length=1,choices=BASIC_TAGS,default='1') free_tags = TaggableManager(blank=True) def __str__(self): return self.title def get_absolute_url(self): return reverse('portal:index') class Feedback(models.Model): EFFECT =( ('1','役立ちそう'), ('2','後々,役立ちそう'), ('3','役に立ちそうにない'), ) NOVEL =( ('1','知らない内容だった'), ('2','知っていたが忘れていた'), ('3','既に知っている内容だった'), ) kh = models.ForeignKey(KnowHow, verbose_name='紐づくノウハウ', on_delete=models.PROTECT) user = models.ForeignKey('auth.User',on_delete=models.CASCADE) query = models.TextField(blank=True) time = models.DateTimeField(auto_now_add=True) efficacy = models.CharField(max_length=1,choices=EFFECT,default='1') novelty = models.CharField(max_length=1,choices=NOVEL,default='1') def __str__(self): return self.query

views.py

from django.urls import reverse, reverse_lazy from django.http import HttpResponse from django.views import generic from django.views.generic.edit import ModelFormMixin from django.shortcuts import redirect,get_object_or_404 from django.core.exceptions import PermissionDenied from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.decorators import login_required from .models import KnowHow from taggit.models import Tag from .forms import SearchForm,FeedbackForm from django.db.models import Q """ Django Auth The LoginRequired mixin https://docs.djangoproject.com/en/2.0/topics/auth/default/#the-loginrequired-mixin The login_required decorator https://docs.djangoproject.com/en/2.0/topics/auth/default/#the-login-required-decorator @login_required """ class IndexView(LoginRequiredMixin,generic.list.ListView): model = KnowHow #paginate_by = 5 ordering = ['-title'] # template_name = 'portal/KnowHow_list.html' class DetailView(ModelFormMixin,LoginRequiredMixin,generic.detail.DetailView): # from https://torina.top/detail/337/ model = KnowHow form_class = FeedbackForm template_name = 'portal/KnowHow_detail.html' def form_valid(self, form): kh_pk = self.kwargs['pk'] Feedback = form.save(commit=False) Feedback.kh = get_object_or_404(KnowHow, pk=kh_pk) Feedback.query="" Feedback.user=self.request.user Feedback.save() return redirect('portal:search') def post(self, request, *args, **kwargs): form = self.get_form() if form.is_valid(): return self.form_valid(form) else: self.object = self.get_object() return self.form_invalid(form) class CreateView(LoginRequiredMixin, generic.edit.CreateView): # The LoginRequired mixin model = KnowHow fields = ['category','title','text','file','basic_tag','free_tags'] #template_name = 'portal/KnowHow_form.html' def form_valid(self, form): # This method is called when valid form data has been posted. # It should return an HttpResponse. # https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-editing/#models-and-request-user form.instance.author = self.request.user return super(CreateView, self).form_valid(form) class UpdateView(LoginRequiredMixin, generic.edit.UpdateView): # The LoginRequired mixin model = KnowHow fields = ['category','title','text','file','basic_tag','free_tags'] #template_name = 'portal/KnowHow_form.html' class DeleteView(LoginRequiredMixin, generic.edit.DeleteView): # The LoginRequired mixin model = KnowHow success_url = reverse_lazy('portal:index') def delete(self, request, *args, **kwargs): result = super().delete(request, *args, **kwargs) Tag.objects.filter(knowhow=None).delete() return result #template_name = 'portal/KnowHow_confirm_delete.html' class SearchIndexView(LoginRequiredMixin, generic.ListView): template_name="search/search_index.html" model = KnowHow def post(self, request, *args, **kwargs): form_value = [ self.request.POST.get('basic_tag', None), self.request.POST.get('free_tags', None), ] request.session['form_value'] = form_value # 検索時にページネーションに関連したエラーを防ぐ self.request.GET = self.request.GET.copy() self.request.GET.clear() return self.get(request, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) basic_tag = '' free_tags = '' if 'form_value' in self.request.session: form_value = self.request.session['form_value'] basic_tag = form_value[0] free_tags = form_value[1] default_data = {'basic_tag': basic_tag, 'free_tags': free_tags, } test_form = SearchForm(initial=default_data) context['test_form'] = test_form return context def get_queryset(self): # sessionに値がある場合、その値でクエリ発行する。 if 'form_value' in self.request.session: form_value = self.request.session['form_value'] basic_tag = form_value[0] free_tags = form_value[1] # 検索条件 condition_basic_tag = Q() condition_free_tags = Q() if len(basic_tag) != 0 and basic_tag[0]: condition_basic_tag = Q(basic_tag=basic_tag) if len(free_tags) != 0 and free_tags[0]: condition_free_tags = Q(free_tags__name__in=free_tags) return KnowHow.objects.filter(condition_basic_tag & condition_free_tags).distinct() else: # 何も返さない return KnowHow.objects.none() @login_required def help(request): return HttpResponse("Member Only Help Page")

urls.py

from django.urls import path from . import views # set the application namespace # https://docs.djangoproject.com/en/2.0/intro/tutorial03/ app_name = 'portal' urlpatterns = [ # ex: / path('', views.IndexView.as_view(), name='index'), # ex: /KnowHow/create/ path('KnowHow/create/', views.CreateView.as_view(), name='create'), # ex: /KnowHow/1/ path('KnowHow/<int:pk>/detail/', views.DetailView.as_view(), name='detail'), # ex: /KnowHow/1/update/ path('KnowHow/<int:pk>/update/', views.UpdateView.as_view(), name='update'), # ex: /KnowHow/1/delete path('KnowHow/<int:pk>/delete/', views.DeleteView.as_view(), name='delete'), # ex: /KnowHow/help/ path('KnowHow/help/', views.help, name='help'), path('search/',views.SearchIndexView.as_view(), name='search') ]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問