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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

5381閲覧

Djangoのdjango-bootstrap-modal-formsを使用して、inline-formsetの登録を行いたいです。

pnbmg0044

総合スコア16

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/04/07 11:38

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">&times;</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

###画面スクリーンショット
モーダル入力フォーム
イメージ説明

createボタン押下後
※ここから動きません。
イメージ説明

###参考にしたサイト
https://stackoverflow.com/questions/56045728/inline-formset-causing-error-nonetype-object-has-no-attribute-is-ajax

ご回答いただければ幸いです。
以上よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。

create_function.htmlのCreateボタンのTypeがbuttonになっていまして、これをsubmitにしたところ、正常に登録されました。

修正前

<button type="button" class="submit-btn btn btn-primary">Create</button>

修正後

<button type="submit" class="btn btn-primary">Create</button>

お手数をお掛けしました。

投稿2020/04/07 19:38

pnbmg0044

総合スコア16

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問