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

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

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

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

Python

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

Q&A

解決済

3回答

7006閲覧

djangoでredirectすると「'str' object has no attribute 'method'」と言うエラーが出ます。

sususu

総合スコア99

Django

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

Python

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

0グッド

1クリップ

投稿2020/05/09 15:07

編集2020/05/10 05:38

djangoでredirectを使用すると「'str' object has no attribute 'method'」と言うエラーが出ます。
1.一応renderでdisplay_blogs.htmlなどrenderに置き換えればエラーが出ないのは確認済みです。
2.save()も正常に動作していることからPOSTの方に処理は行っているみたいです。
3.from django.shortcuts import redirectでインポートもしています。

該当するのは「views.py」の下の「return redirect('app:display_blogs')」の部分です。

def edit_blog(request, blog_id): blog = get_object_or_404(Blog, id=blog_id) if request.method == "POST": form = BlogForm(request.POST, instance=blog) if form.is_valid(): form.save() return redirect('app:display_blogs')#リダイレクトにするとエラー発生 else: form = BlogForm(instance=blog) context = { 'blog': blog, 'form': form, } return render(request, 'app/edit_blog.html', context)

urls.py

from django.urls import path from . import views app_name = 'app' urlpatterns = [ path('display_blogs/', views.display_blogs, name='display_blogs'), path('edit_blog/<int:blog_id>/', views.edit_blog, name='edit_blog'), ]

display_blogs.html

{% extends 'app/base.html' %} {% block content %} <table class = 'data_record'> <tr> <th>title</th> <th>create date</th> <th></th> </tr> {% for blog in blogs %} <tr> <td>{{ blog.title }}</td> <td>{{ blog.created_datetime }}</td> <form method="get" action="{% url 'app:edit_blog' blog.pk %}"> <td><button type="submit" class="edit_button">edit</button></td> </form> </tr> {% endfor %} </table> {% endblock %}

edit_blog.html

{% extends 'app/base.html' %} {% block content %} {% load widget_tweaks %} <form action="{% url 'app:edit_blog' blog.id %}" method="POST">{% csrf_token %} <table> <tr> <td>title:</td> <td>{{ form.title|add_class:"input_box" }}</td> </tr> <tr> <td>body:</td> <td>{{ form.text|add_class:"input_box" }}</td> </tr> <tr> <td></td> <td><button type="submit" class="post_button">save</button></td> </tr> </table> </form> {% endblock %}

「def edit_blog(request, blog_id):」のすぐ下に「redirect」を指定しただけでも同じエラーが出てしまったので、
redirectの指定の仕方が問題なのかと思い、引数に「app/display_blogs/」や「display_blogs/」等入れてみたりしましたができませんでした。
どなたかご教授頂けると幸いです。
ご回答の程よろしくお願いいたします。

リダイレクトだけする関数を作成しましたが、それだけでもエラーが出ます。
どうやらredirectの部分に問題があるように思われますが引き続き調査しております。
よろしくお願いいたします。

#urls.py path('test_redirect/', views.test_redirect, name='test_redirect'), #views.py #test def test_redirect(request): return redirect('app:index')

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

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

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

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

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

guest

回答3

0

views.pyのdisplay_blogs関数に問題があるのでは?

投稿2020/05/09 22:25

ForestSeo

総合スコア2720

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

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

sususu

2020/05/10 05:28

ご回答ありがとうございます。 get で display_blogs を直接URLから呼び出すと問題なく表示されているのは確認が取れております。 redirectだと何か挙動が変わってしまう等ありますでしょうか。 引き続き調査しておりますがよろしくお願いいたします。
ForestSeo

2020/05/10 05:41

from django.urls import reverse_lazy return redirect(reverse_lazy('app:display_blogs')) とかでいけませんか?
sususu

2020/05/10 05:51

ご回答ありがとうございます。 上記に変更したところ下記のようなエラーが出ましたので一度こちらにてご報告させて頂きます。 ------------------------------------------------------------------------- AttributeError at /app/edit_blog/1/ '__proxy__' object has no attribute 'method' Request Method: POST Request URL: http://127.0.0.1:8001/app/edit_blog/1/ Django Version: 3.0.5 Exception Type: AttributeError Exception Value: '__proxy__' object has no attribute 'method' Exception Location: /usr/local/lib/python3.6/site-packages/django/views/generic/base.py in dispatch, line 93 Python Executable: /usr/bin/python3 Python Version: 3.6.8 ------------------------------------------------------------------------- お手数おかけしますがご返信頂ければ幸いです。 よろしくお願いいたします。
ForestSeo

2020/05/10 06:05

うーん なぜでしょう
sususu

2020/05/10 06:10

ご回答ありがとうございます。 該当箇所を下記の通りに変更しましたら、また違うエラーが出ました。 url = "app:index" return HttpResponseRedirect(url) エラー内容--------------------------------------------------------------- DisallowedRedirect at /app/edit_blog/2/ Unsafe redirect to URL with protocol 'app' Request Method: POST Request URL: http://127.0.0.1:8001/app/edit_blog/2/ Django Version: 3.0.5 Exception Type: DisallowedRedirect Exception Value: Unsafe redirect to URL with protocol 'app' Exception Location: /usr/local/lib/python3.6/site-packages/django/http/response.py in __init__, line 462 Python Executable: /usr/bin/python3 ------------------------------------------------------------------------------------ 一応 docker のリスタート、アパッチのリスタートもしているのですが現状変わらない状態です。 また何かわかりましたらご連絡させて頂きます。 ありがとうございます。
sususu

2020/05/10 09:09

こちらの件解決いたしました。 大変ご迷惑おかけしました。 下記をコメントアウトしたらリダイレクトされるようになりました。 urls.py # path('redirect/', views.redirect, name='redirect'), viws.py # class RedirectView(RedirectView): # url = '/app/redirected/' # redirect = RedirectView.as_view() 「redirect」と言う名前を定義してしまった私の知識不足が原因でした。 またurlsとviewsには色々な情報が載っていたためすべてを開示しておりませんでした。 申し訳ございません。 今後は名前の付ける時に考慮するようにいたします。 またteratailでも出来る限り情報を公開しようと思いました。 この度は御協力頂きましてありがとうございました。
ForestSeo

2020/05/10 09:20

redirectを定義しちゃってたんですね。 なるほど思いつきませんでした
sususu

2020/05/10 09:52

大変失礼いたしました。 今後は同じ名前を検索して疑っていこうと思います。 ありがとうございました。
guest

0

はずしているかもしれませんが。

return redirect('app:display_blogs') する時に display_blogs.html で必要としている blogs が与えられていないような気がするのですが、問題ないのでしょうか?

【追記】
はずしていました。そこは、display_blogs がするから、問題ないですよね。

投稿2020/05/09 16:05

編集2020/05/09 16:59
Yasumichi

総合スコア1773

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

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

sususu

2020/05/10 05:19

ご回答ありがとうございます。 一応display_blogsのURLを叩いているので、 app:display_blogs → def display_blogs と呼ばれているかと思っております。 なので def display_blogs が呼ばれたときに templates に値が送られているかと思われるのですが、もし私が何かredirectの機能について認識違いがありましたらご教授頂けると幸いです。
guest

0

自己解決

下記をコメントアウトしたらリダイレクトされるようになりました。

urls.py

path('redirect/', views.redirect, name='redirect'),

viws.py

class RedirectView(RedirectView):

url = '/app/redirected/'

redirect = RedirectView.as_view()

投稿2020/05/10 09:10

sususu

総合スコア99

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問