Djangoのdjango-bootstrap-modal-formsを使用して、inline-formsetの登録を行いたいです。
Djangoで日報システムを作成しています。
システム開発を行っている部署用に機能名(親)、機能詳細名(子)を登録処理を実装中に以下の問題が発生しました。
発生している問題
1.機能名(親)は登録できますが、機能詳細名(子)は登録ができません。 2.ブレイクポイントを挟んで、デバッグしてみましたが、正常にformset.save()が行われているにも関わらず、登録が行われません。 3.formset.save()後に別ページに飛ぶように指示していますが、入力フォームがおかしな形となって画面一面に表示され、その画面から動かない状況になります。
ソースコード
models.py
class FunctionMasta(models.Model): コード = models.IntegerField(primary_key=True) 機能名 = models.CharField(max_length=30) 部署 = models.CharField(max_length=10, blank=True, null=True) 得意先コード = models.IntegerField(blank=True, null=True) 得意先名 = models.CharField(max_length=50, blank=True, null=True) 備考 = models.CharField(max_length=200, blank=True, null=True) 登録日付 = models.TimeField(default=timezone.now) 更新日付 = models.TimeField(blank=True, null=True) class Meta: managed = False db_table = 'M_機能' class DetailFunctionMasta(models.Model): コード = models.IntegerField(primary_key=True) 機能コード = models.ForeignKey(FunctionMasta, models.DO_NOTHING, db_column='機能コード') 機能詳細名 = models.CharField(max_length=50) 登録日付 = models.TimeField(default=timezone.now) 更新日付 = models.TimeField(blank=True, null=True) class Meta: managed = False db_table = 'M_機能詳細'
forms.py
class FunctionMastaForm(BSModalForm): class Meta: model = FunctionMasta fields = ('コード', '機能名', '得意先コード', '得意先名', '備考') class DetailFunctionMastaForm(BSModalForm): class Meta: model = DetailFunctionMasta fields = ('コード', '機能詳細名') CreateFunctionMastaFormset = inlineformset_factory( parent_model=FunctionMasta, model=DetailFunctionMasta, form=DetailFunctionMastaForm, extra=1 )
views.py
class FunctionMastaCreateView(BSModalCreateView): model = FunctionMasta template_name = "modal/create_function.html" form_class = FunctionMastaForm def get_context_data(self, **kwargs): context = super(FunctionMastaCreateView, self).get_context_data(**kwargs) function_code = FunctionMasta.objects.all().aggregate(Max('コード')).get('コード__max') if self.request.method == "POST": context['detail_function_formset'] = CreateFunctionMastaFormset(self.request.POST or None, instance=self.object,form_kwargs={'request':self.request}) else: if function_code is None: function_code = 1 else: function_code += 1 detail_function_code = DetailFunctionMasta.objects.all().aggregate(Max('コード')).get('コード__max') # detail_function_codeが空文字なら0に変換 if detail_function_code is None: detail_function_code = 1 else: detail_function_code += 1 context['form'] = FunctionMastaForm(initial={'コード': function_code}) context['detail_function_formset'] = CreateFunctionMastaFormset(initial=[{'コード':detail_function_code}]) return context def form_valid(self, form, **kwargs): context = self.get_context_data() formset = context['detail_function_formset'] if formset.is_valid(): self.object = form.save(commit=False) formset.instance = self.object with transaction.atomic(): self.object.save() formset.instance = self.object formset.save() return render(self.request, 'index.html') else: context['form'] = form return self.render_to_response(context)
function_masta.html
{% block content %} <div class="modal fade" tabindex="-1" role="dialog" id="modal_create_function"> <div class="modal-dialog" role="document"> <div class="modal-content"> </div> </div> </div> <div class="modal fade" tabindex="-1" role="dialog" id="modal_update_function"> <div class="modal-dialog" role="document"> <div class="modal-content"> </div> </div> </div> {% include 'modal/confirm_function.html' %} <div class="container"> <div class="row"> <div class="CorrespondBody col-12 col-sm-12"> <div class="inline_box_head"> <div class="inline_head"> <h2 class="col-12 Correspond_title">機能マスタ</h2> </div> <div class="inline_btn"> <a class="btn_Back" type="button" href="{% url 'daily_reports:main_menu' %}">戻る</a> </div> </div> <!-- <button class="function_masta_create btn btn-primary" type="button" name="button">新規登録</button>--> <button class="function_masta_create btn btn-primary" type="button" name="button" data-toggle="modal" data-target="#modal_create_function">新規登録</button> <table> <tr> <th></th> <th></th> <th>コード</th> <th>機能名</th> <th>得意先名</th> </tr> <tbody> {% for list in object_list %} <tr class="customer_info_list"> <td> <button type="button" class="function_masta_confirm" data-toggle="modal" data-target="#modal_confirm_function"> <img src="/static/img/confirm_icon.png"> </button> </td> <td> <button type="button" class="function_masta_update" data-id="{% url 'daily_reports:function_masta_update' list.pk %}"> <img src="/static/img/update_icon.png"> </button> </td> <td>{{ list.pk }}</td> <td>{{ list.機能名 }}</td> <td>{{ list.得意先名 }}</td> </tr> {% endfor %} </tbody> </table> <div class="bottom_back"> <button type="submit" class="btn_bottom_Back">戻る</button> </div> </div> </div> </div> {% endblock %} {% block bottom_script %} <script type="text/javascript"> $(".function_masta_create").modalForm({ modalID: "#modal_create_function", formURL: "{% url 'daily_reports:function_masta_create' %}" }); </script> {% endblock bottom_script %}
create_function.html
<form method="post" action=""> {% csrf_token %} <div class="modal-header"> <h5 class="modal-title">機能新規登録</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-middle-head"> <div class="basic_info"> <div class="function_id_box col-12 col-sm-12 col-md-8"> <label class="function_id">機能コード</label><br> {{ form.コード }} </div> <div class="function_name_box col-12 col-sm-12 col-md-8"> <label class="function_name">機能名</label><br> {{ form.機能名 }} </div> {% include 'modal/customer_search.html' %} <div class="customer_name_box col-12 col-sm-12 col-md-6"> <label class="customer_name">得意先名</label><br> {{ form.得意先コード }} {{ form.得意先名 }} <button type="button" class="btn_seach_customer" data-toggle="modal" data-target="#modal_customer_search">▼</button> </div> <div class="remarks_box col-12 col-sm-12 col-md-8"> <label class="remarks">備考</label><br> {{ form.備考 }} </div> </div> </div> <div class="modal-body"> {{ detail_function_formset.management_form }} <h5>機能詳細</h5> <table> <tr> <th>機能詳細コード</th> <th>機能詳細名</th> </tr> <tbody id="create_detail_function_list_tbody"> {% for form in detail_function_formset.forms %} <tr> <td> {{ form.コード }} <span class="helptext">{{ form.コード.help_text }}</span> {{ form.コード.errors }} </td> <td> {{ form.機能詳細名 }} <span class="helptext">{{ form.機能詳細名.help_text }}</span> {{ form.機能詳細名.errors }} </td> </tr> </tbody> {% endfor %} </table> </div> <div class="modal-middle-footer"> <button type="button" class="btn btn-primary" id="add">行追加</button> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="submit-btn btn btn-primary">Create</button> </div> </form>
試したこと
views.pyに記載の form_kwargs={'request': self.request} は、stack overflowに似たような質問及び回答がありましたので、引用しました。
この記載がない状態で実行しますと、self.object = form.save(commit=False)でエラーが生じます。
エラーの内容は、AttributeError: 'NoneType' object has no attribute 'is_ajax' というものです。
補足情報(FW/ツールのバージョンなど)
Python 3.8.1
Django 3.0.4
django-bootstrap-modal-forms 1.5.0
###参考にしたサイト
■https://stackoverflow.com/questions/56045728/inline-formset-causing-error-nonetype-object-has-no-attribute-is-ajax
ご回答いただければ幸いです。
以上よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。