🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

Python

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

HTML

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

Q&A

解決済

2回答

2297閲覧

Djangoでの「不正なURIの形式」の修正方法

luciano

総合スコア11

Django

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

Python

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

HTML

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

0グッド

0クリップ

投稿2020/12/26 07:42

前提・実現したいこと

Djangoを勉強中の初心者です。
以前にも同じ問題で質問させて頂いたのですが、ソースコード等でより具体的にしなかったため内容がわかりにくかったのではと思い、その点を修正して再度投稿させて頂きます。

単語カード的なアプリを試作中です。
ローカルの仮想環境では何とか動いてはいるのですが、Pythonanywhereでデプロイすると、「400 Bad Request openresty/1.15.8.3」が出て、動かなくなります。

状況は、問題の条件を設定するページ(set.html)上で、forms.MultipleChoiceFieldを使って条件を設定した後、ボタンでSubmitした時です。ローカルの仮想環境では動いているものの、ChromeのConsole上で、以下のエラーメッセージが出ているのがその原因ではないかと考えています。

後学のためにもご教示頂きたいポイントは以下の点です。

  1. 当該URIのどの部分が不正なのか
  2. それを発生させているのはコードのどの部分なのか(views.py/urls.py ?)
  3. もしくはBootstrap等によるものなのか
  4. その部分をどう修正すべきか

そもそも原因の見当が的外れなのかもしれませんが、その場合は、その旨ご指摘いただけるだけでも大変助かりますので、どうかよろしくお願い致します。

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

The attempt to bind "/myapp/set/%%20url%20'set'%20%" in the workspace failed as this URI is malformed.

該当のソースコード

以下、一部省略/単純化しています。

forms.py

Python

1class SelectForm(forms.Form): 2 3 AAA = forms.MultipleChoiceField ( 4 label = 'AAA', 5 choices = [ 6 ("a","aaa"), 7 ("b","bbb"), 8 widget = forms.CheckboxSelectMultiple(), 9 required=False, 10 ) 11 XXX = forms.MultipleChoiceField ( 12 label = 'XXX', 13 choices = [ 14 ("x","xxx"), 15 ("y","yyy"), 16 widget = forms.CheckboxSelectMultiple(), 17 required=False, 18 )

views.py

Python

1class SetView(TemplateView): 2 3 def __init__(self): 4 self.params = { 5 'title': 'set', 6 'form': SelectForm(), 7 } 8 9 def get(self, request): 10 return render (request, 'set.html', self.params) 11 12 def post (self, request): 13 14 #チェックボタンから候補選択のリストを作る 15 AAA_chcd = request.POST.getlist('AAA') 16 XXX_chcd = request.POST.getlist('XXX') 17 18 #上記リストを結合 19 cnddt = AAA_chcd + XXX_chcd 20 21 return render (request, 'set.html', self.params)

myapp/urls.py

Python

1 2app_name = 'myapp' 3 4urlpatterns = [ 5 url(r'^set/', SetView.as_view(), name = 'set') 6]

set.html

html

1{% load static %} 2<!doctype html> 3 4<head> 5 <meta charset="utf-8"> 6 7 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous"> 8 9 <link rel="stylesheet" type="text/css" href={% static 'myapp/css/bootstrap.min.css' %} /> 10 <link rel="stylesheet" type="text/css" href={% static 'myapp/css/custom.css' %} /> 11 <title>{{title}}</title> 12</head> 13 14<body> 15 {% load crispy_forms_tags %} 16 17 <!--Nav-Bar(省略) --> 18 19 <form action="% url 'set' %" method="post"> 20 {% csrf_token %} 21 22 <div class="container-fluid"> 23 <div class="row"> 24 <div class="col">{{ form.AAA|as_crispy_field }} </div> 25 <div class="col">{{ form.XXX|as_crispy_field }} </div> 26 </div> 27 </div> 28 29 <div class="container-fluid"> 30 <div class="d-flex justify-content-center"> 31 32 <div class="col"> 33 <button type="submit" class="btn btn btn-dark btn-block"> 34 Set 35 </button> 36 </div> 37 38 </div> 39 </div> 40 41 </form> 42 43 <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> 44 <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script> 45 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js" integrity="sha384-OgVRvuATP1z7JjHLkuOU7Xw704+h835Lr+6QL9UvYjZE3Ipu6Tp75j7Bh/kR0JKI" crossorigin="anonymous"></script> 46 47</body> 48 49</html>

補足情報(FW/ツールのバージョンなど)

[環境]
Mac Os Catalina
Django 3.1.1
Python 3.8

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

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

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

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

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

guest

回答2

0

自己解決

色々と調べてみて、set.htmlの

html

1<form action="% url 'set' %" method="post">

html

1<form action="" method="post">

としたところ、pythonanywhere上でも動くようになりました。
お騒がせしました。

投稿2020/12/28 05:22

luciano

総合スコア11

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

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

0

HTML

1<form action="% url 'set' %" method="post">

HTML

1<form action="{% url 'set' %}" method="post">

ではないでしょうか。

投稿2020/12/26 08:35

A_kirisaki

総合スコア2853

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

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

luciano

2020/12/26 09:12

ご回答ありがとうございます。 早速試してみたのですが、以下のエラーがブラウザから返ってきました。 NoReverseMatch at /myapp/set/ Error during template rendering Reverse for 'set' not found. 'set' is not a valid view function or pattern name.
A_kirisaki

2020/12/26 09:33

んっ、render で直接描画してる……?どっから持ってきましたその render?
luciano

2020/12/26 10:27

お返事ありがとうございます。 Request Method:GETになっているので、views.pyの def get(self, request): return render (request, 'set.html', self.params) ということでしょうか? 見当違いだったらすみません。
luciano

2020/12/26 12:18

となると、どこをどう修正すれば良いのでしょうか?
A_kirisaki

2020/12/26 12:52

render を使うためには import したと思うんですが、どうやって import したか追記してくださると助かります
luciano

2020/12/27 00:28

失礼しました。 views.pyで from django.shortcuts import render としています。
luciano

2020/12/28 06:37

良いヒントを頂き、解決出来ました。 ありがとうございまいした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問