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

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

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

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

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

検索

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1536閲覧

GET,PUT対応のボタンを押したときに入力フォームがクリアされないようにしたい

akane_emo

総合スコア30

Django

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

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

検索

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

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/10/06 13:45

前提・実現したいこと

検索条件を入力して結果を表示する画面を作成しています。
「検索」ボタンを押すと検索結果を表示するのですが、ボタンを押したと同時に検索入力のフォームがクリアされてしまいます。
「検索」ボタンを押しても検索入力フォームがクリアされないようにしたいです。
(添付画像では入力したコードがクリアされてしまっています。
開始日、終了日はdefaultで今日の日付を設定しているのですが、日付を変更したときは変更日付で値が残ってほしいです。)

よろしくお願いいたします。

(検索実行前)
![イメージ説明]

(検索実行後:)
イメージ説明

発生している問題・エラーメッセージ

検索ボタンだけでなく、DeleteViewで作成した詳細画面から戻るときも条件がクリアされてしまっています。

該当のソースコード

forms

1# 日付選択(開始日) 2class DateFormStart(forms.ModelForm): 3 4 class Meta: 5 model = DateModeStart 6 fields = '__all__' 7 widgets = { 8 'date_field_start': AdminDateWidget(), # インポートしたウィジェットを使う指示 9 } 10 11# 日付選択(終了日) 12class DateFormEnd(forms.ModelForm): 13 14 class Meta: 15 model = DateModeEnd 16 fields = '__all__' 17 widgets = { 18 'date_field_end': AdminDateWidget(), # インポートしたウィジェットを使う指示 19 } 20class DropForm(forms.Form): 21 22 # コード 23 JanCode = forms.IntegerField(label='コード',required=False,min_value=0,max_value=9999999999999, \ 24 widget=forms.NumberInput(attrs={'class':'form-control'}))

models

1# フォーム設定(日付開始日) 2class DateModeStart(models.Model): 3 4 date_field_start = models.DateField( 5 verbose_name='開始日', 6 blank=True, 7 null=True, 8 default=datetime.now, 9 ) 10 11 def __str__(self): 12 return self.date_field_start 13 14# フォーム設定(日付終了日) 15class DateModeEnd(models.Model): 16 17 date_field_end = models.DateField( 18 verbose_name='終了日', 19 blank=True, 20 null=True, 21 default=datetime.now, 22 ) 23 24 def __str__(self): 25 return self.date_field_end

views

1class IndexViewBacrex(LoginRequiredMixin,ListView,FormMixin): 2 3 # ListView 4 template_name = 'OrderProcess/index.html' 5 model = Order 6 context_object_name = 'data' # templateに渡す名前 7 paginate_by = 10 8 9 # FormMixin 10 form_class = SelectEdiForm 11 success_url = reverse_lazy('orderprocess_bacrex_index') 12 13 14 # GETオーバーライド 15 def get_context_data(self, **kwargs): 16 context = super().get_context_data(**kwargs) 17 context['date_form_start'] = DateFormStart 18 context['date_form_end'] = DateFormEnd 19 context['drop_form'] = DropForm 20 return context 21 22 23 # 検索機能 24 def get_queryset(self): 25 queryset = Order.objects 26 27 if "search" in self.request.GET: 28 # 日付取込 29 dateStart = self.request.GET.get('date_field_start') 30 dateEnd = self.request.GET.get('date_field_end') 31 # コード 32 jancode = self.request.GET.get('JanCode') 33 34 # 日付検索 35 if dateStart and dateEnd: 36 print("開始~終了") 37 query = Q(OrderProcessingDate__gte = dateStart, OrderProcessingDate__lte = dateEnd) 38 elif not dateStart and dateEnd: 39 print("~終了") 40 query = Q(OrderProcessingDate__lte = dateEnd) 41 elif dateStart and not dateEnd: 42 print("開始~") 43 query = Q(OrderProcessingDate__gte = dateStart) 44 elif not dateStart and not dateEnd: 45 print("~") 46 query = Q() 47 48 # コード 49 if jancode: 50 print("コード") 51 query &= Q(JANCode__contains = jancode) 52 53 54 data = queryset.filter(query) 55 56 else: 57 print("デフォルト") 58 data = queryset.filter(OrderProcessingDate = datetime.date.today()) 59 60 return data

HTML

1<!--検索条件--> 2 <form action="" method="get"> 3 <!--日付検索--> 4 <li class="list-group-item"> 5 <div class="row"> 6 <div class="col-12"> 7 <div class="row"> 8 <div class="col-3"> 9 <input type="hidden" name="form_type" value="__date_form_start__"> 10 {{ date_form_start }} 11 </div> 12 <div class="col-3"> 13 <input type="hidden" name="form_type" value="__date_form_end__"> 14 {{ date_form_end }} 15 </div> 16 </div> 17 </div> 18 </div> 19 <br> 20 <!--検索--> 21 <div class="row"> 22 <div class="col-12"> 23 <div class="row"> 24 <div class="col-2"> 25 <!--JANコード--> 26 {{ drop_form.JanCode.label}} 27 {{ drop_form.JanCode}} 28 </div> 29 </div> 30 </div> 31 </div> 32 </li> 33 34 <button class="btn btn-primary mt-1" type="submit" name="search">検 索</button> 35 36 </form>

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

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

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

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

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

guest

回答2

0

自己解決

Ajaxがいいのかなと思いましたがDjangoの機能で出来る方法を見つけました。
sessionを使用して解決出来ました。

views

1def get_context_data(self, **kwargs): 2 context = super().get_context_data(**kwargs) 3 context['date_form_start'] = DateFormStart(self.request.session.get('date_form_start')) 4 context['date_form_end'] = DateFormEnd(self.request.session.get('date_form_end')) 5 context['drop_form'] = DropForm(self.request.session.get('drop_form')) 6 return context 7 8def get_queryset(self): 9# セッションに入力データ保存 10 self.request.session['date_form_start'] = self.request.GET 11 self.request.session['date_form_end'] = self.request.GET 12 self.request.session['drop_form'] = self.request.GET

投稿2021/10/07 09:17

akane_emo

総合スコア30

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

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

0

form送信していて初期値入れていないならクリアはされます。
正確には送信先(formのaction属性の設定値)に送ったリクエストはそのリクエストを元に上から実行されるので「何もない初期状態となる」と言うべきでしょうか。

この対応策として考えられるのはいずれか

  • 受け取ったリクエストから初期値としてvalueに設定する
  • いわゆるform送信せず、Ajaxでサーバーサイドの処理を実行して検索結果の個所のみJavaScriptで書き換える

現状から大きく書き換える必要がないのは前者ですね。

投稿2021/10/06 21:40

編集2021/10/06 21:42
m.ts10806

総合スコア80875

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問