前提・実現したいこと
djangoについての質問となります。
※Viewを関数からClassに変更したため、内容を全体的に更新いたしました。
【処理の流れ】
①VIEWのclass 商品Editは、商品編集(追加や変更)をするページとなります。
②現在、商品編集ページでの追加や変更処理は正常に動作しております。
③今回、商品編集ページでは、メーカーNOを検索するための入力項目があります。
④検索項目にメーカーNOを入力して検索ボタンをおすと、メーカーNO_ARの絞り込みをしてSELECTフォームを対象の1件だけをリスト表示する。
現在、上記④がうまく処理できない状況となっております。
get_form_kwargsを使用して、SELECTフォームのリストに表示されるメーカ名を1件にしたいのですが、現在は登録されているメーカー名がすべてSELECTフォームのリストに表示されてしまっている状態です。
いろいろ試したのですが、なにをやってもうまくいかないため、もし良い解決策があればご教授をお願いします。
該当のソースコード
【モデルファイル名:models.py】 class メーカー情報(models.Model): メーカーNO = models.CharField('メーカーNO', max_length=10, primary_key=True) メーカー名 = models.CharField('メーカー名', max_length=255) def __str__(self): return self.メーカー名 class 商品情報(models.Model): 商品ID = models.AutoField(primary_key=True) 商品名 = models.CharField('商品名', max_length=255) メーカーNO_AR = models.ForeignKey('メーカー情報', related_name='メーカーNO_AR', verbose_name='メーカー名', to_field='メーカーNO', on_delete=models.PROTECT)
【フォームファイル名:forms.py】 from django.forms import ModelForm from django import forms from django.utils import timezone from emr.models import * class メーカーForm(ModelForm): class Meta: model = メーカー情報 fields = ('メーカーNO', 'メーカー名', '登録者') class 商品Form(ModelForm): class Meta: model = 商品情報 fields = ('商品ID', ’商品名’, 'メーカーNO_AR') def __init__(self, *args, **kwargs): id = kwargs.pop('q_word') super(商品Form,self).__init__(*args, **kwargs) self.fields['メーカーNO_AR'].queryset = メーカー情報.objects.filter(メーカーNO=id)
【ビューファイル名:views.py】 from django.shortcuts import render, get_object_or_404, redirect from django.http import HttpResponse from django.contrib.auth.decorators import login_required from emr.models import メーカー情報, 商品情報 from emr.forms import メーカーForm,商品Form from django.db.models import Q from django.views.generic.edit import FormView from django.views import generic class 商品Edit(generic.TemplateView, FormView): form_class = 商品Form() def __init__(self): self.params = { 'form':商品Form() } def get_form_kwargs(self): q_word = request.GET.get('query') kwargs = super(商品Edit,self).get_form_kwargs() kawrgs.update({'q_word': q_word}) return kwargs def get(self, request, 商品ID=None, メーカーNO_AR=None, *args, **kwargs): if 商品ID: 商品_cnt = get_object_or_404(商品情報, pk=商品ID) else: 商品_cnt = 商品情報() form = 商品Form(instance=商品_cnt) return render(request,'emr/商品_edit.html', dict(form=form, 商品ID=商品ID)) def post(self, request, 商品ID=None, メーカーNO_AR=None, *args, **kwargs): if 商品ID: 商品_cnt = get_object_or_404(商品情報, pk=商品ID) else: 商品_cnt = 商品情報() form = 商品Form(request.POST, instance=商品_cnt) if form.is_valid(): 商品_cnt = form.save(commit=False) 商品_cnt.save() return redirect('emr:商品_list') else: form = 商品Form(instance=商品_cnt) return render(request,'emr/商品_edit.html', dict(form=form, 商品ID=商品ID))
【HTMLファイル名:商品_edit.html】 {% extends "emr/base.html" %} {% load bootstrap4 %} {% block title %}商品編集{% endblock title %} {% block content %} <h4 class="mt-4 mb-5 border-bottom">商品の編集</h4> {% if 商品ID %} <form action="{% url 'emr:商品_mod' 商品ID=商品ID %}" method="post"> {% else %} <form action="{% url 'emr:商品_add' %}" method="post"> {% endif %} {% csrf_token %} {% bootstrap_form form layout='horizontal' %} <div class="form-group row"> <div class="offset-md-3 col-md-9"> <button type="submit" class="btn btn-primary">送信</button> </div> </div> </form> <a href="{% url 'emr:商品_list' %}" class="btn btn-secondary btn-sm">戻る</a> {% endblock content %}
あなたの回答
tips
プレビュー