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

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

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

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

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1706閲覧

Djangoでhttpステータスを返却する方法

YUMA-NAGAO

総合スコア41

Django

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

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/02/04 03:02

編集2020/02/04 05:44

#前提・実現したいこと

指定されていないURLを打ち込むと、「404NotFound」
という風になると思います。
しかし、404NotFoundと出さないで、他のページにリダイレクトさせて、HTTPステータスを200で返却させたいです。
こちらのサイトに書かれているものから、Flaskでは、可能ということがわかったのですが、Djangoでは、どのように実装すれば良いかわからないです。

教えていただきたいことは、3つあります。
1,HTTPステータスコードの返り値を404から200に指定する方法
2,他のページに自動的にリダイレクトさせる方法
3,1と2を組み合わせる方法

#試したこと
Django HTTPステータス 返り値で検索して出てきた、こちらのサイトでHTTPステータス返り値を指定する方法は、わかりました。
しかし、404から200に指定して、自動的にリダイレクトする方法をわからなかったので、教えていただきたいです。

リダイレクト先は、list.htmlです。

#該当のソースコード

Python

1views.py 2 3from django.shortcuts import render, redirect, get_object_or_404 4from django.contrib.auth.models import User 5from django.views.generic import CreateView,View 6from django.urls import reverse_lazy 7from django.http import HttpResponse 8 9 10 11from .models import BoardModel, Comment, Reply 12 13class FailedRequest(View): 14 def get(self, request, *args, **kwargs): 15 response = HttpResponse(status=400) 16 17 return response 18 19 20def listfunc(request): 21 object_list = BoardModel.objects.all() 22 return render(request, 'list.html', {'object_list': object_list}) 23 24 25def detailfunc(request, pk): 26 object = BoardModel.objects.get(pk=pk) 27 return render(request, 'detail.html', {'object': object}) 28 29 30class BoardCreate(CreateView): 31 template_name = 'create.html' 32 model = BoardModel 33 fields = ('title', 'content', 'author', 'images') 34 success_url = reverse_lazy('list') 35 36 37class CommentView(CreateView): 38 model = Comment 39 fields = ('name', 'text') 40 template_name = 'comment_form.html' 41 42 def form_valid(self, form): 43 post_pk = self.kwargs['pk'] 44 post = get_object_or_404(BoardModel, pk=post_pk) 45 46 comment = form.save(commit=False) 47 comment.post = post 48 # comment.post = get_object_or_404(BoardModel, pk=post_pk) 49 comment.save() 50 # 記事の設定 51 52 return redirect('detail', pk=post_pk) 53 # 記事の詳細にリダイレクト 54 55 56class ReplyView(CreateView): 57 model = Reply 58 fields = ('name', 'text') 59 template_name = 'comment_form.html' 60 61 def form_valid(self, form): 62 comment_pk = self.kwargs['pk'] 63 comment = get_object_or_404(BoardModel, pk=comment_pk) 64 65 reply = form.save(commit=False) 66 reply.target = comment 67 reply.save() 68 # 記事の設定 69 70 return redirect('detail', pk=comment.target.pk) 71 # 記事の詳細にリダイレクト 72

Python

1models.py 2 3from django.db import models 4from django.utils import timezone 5 6 7# Create your models here. 8class BoardModel(models.Model): 9 # 記事 10 title = models.CharField(max_length=100) 11 content = models.TextField() 12 author = models.CharField(max_length=100) 13 images = models.ImageField(upload_to='') 14 good = models.IntegerField(null=True,blank=True,default=0) 15 read = models.IntegerField(null=True,blank=True,default=0) 16 readtext = models.CharField(max_length=200,null=True,blank=True,default='a') 17 created_date=models.DateTimeField(default=timezone.now) 18 def __str__(self): 19 return self.title 20 21class Comment(models.Model): 22 # コメント 23 name=models.CharField(max_length=100,blank=True,default='名無し') 24 text=models.TextField() 25 post=models.ForeignKey(BoardModel,on_delete=models.CASCADE) 26 created_date=models.DateTimeField(default=timezone.now) 27 def __str__(self): 28 return self.name 29 30class Reply(models.Model): 31 # 返信コメント 32 name=models.CharField(max_length=100,blank=True) 33 text=models.TextField() 34 target=models.ForeignKey(Comment,on_delete=models.CASCADE) 35 is_publoc=models.BooleanField(default=True) 36 created_date=models.DateTimeField(default=timezone.now) 37 # defaultの値をFalseにしておくと、コメントの承認機能をつけることが出来る 38 # Trueなので、承認機能が無い状態 39 def __str__(self): 40 return self.name 41

Python

1urls.py 2 3from django.urls import path 4from .views import listfunc, detailfunc, BoardCreate,CommentView 5urlpatterns = [ 6 7 path('', listfunc, name='list'), 8 path('list/', listfunc, name='list'), 9 path('detail/<int:pk>', detailfunc, name='detail'), 10 path('create/', BoardCreate.as_view(), name='create'), 11 path('comment/<int:pk>/',CommentView.as_view(),name='comment'), 12 13 14] 15

HTML

1list.html 2 3 4{% extends 'base.html' %} 5 6{% block customcss %} 7{% endblock customcss %} 8 9{% block header %} 10 <div class="alert alert-primary" role="alert"> 11 掲示板風SNS 12 </div> 13{% endblock header %} 14 15{% block content %} 16 <div class='container'> 17 {% for item in object_list %} 18 <div class="alert alert-success" role="alert"> 19 <p>タイトル:{{ item.title }}</p> 20 <p>投稿者:{{ item.author }}</p> 21 <a href="{% url 'detail' item.pk %}">続きを読む</a> 22 23 </div> 24 {% endfor %} 25 26 27 <a href="{% url 'create' %}" class="btn btn-info btn-lg " tabindex="-1" role="button" 28 aria-disabled="true">新規作成</a> 29 </div> 30{% endblock content %} 31

#教えていただきたいこと
3点あります。

1,HTTPステータスコードの返り値を404から200に指定する方法
2,他のページに自動的にリダイレクトさせる方法
3,1と2を組み合わせる方法

自力で解決できるようになりたいので、どのように考えたかも教えていただけますと、幸いです。!

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

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

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

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

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

Lhankor_Mhy

2020/02/04 03:36

flask タグがついていますが、どういう関係がありますか?
YUMA-NAGAO

2020/02/04 03:38

参考サイトの中にflaskがあるので、タグ付けしてます
Lhankor_Mhy

2020/02/04 03:47

Django1系なら url(r'^.*$', とするところなんでしょうけど、3系はどうなんでしょう? path('<path>', とかでしょうか?
YUMA-NAGAO

2020/02/04 03:49

環境を記述していませんでしたね 記述します Python3.7で Django2.2です。 URLの指定は、path('<path>', です
Lhankor_Mhy

2020/02/04 03:53

path('<path>', ではフォールバックできませんでしたか?
YUMA-NAGAO

2020/02/04 03:55

今回は、指定されていないurls.pyで自動的にやるという方法を探しています。 path('<path>', で指定すると、元に戻るということでましょうか?
Lhankor_Mhy

2020/02/04 03:56

re_path(r'^.*$', とかではどうでしょう?
YUMA-NAGAO

2020/02/04 04:00

urls.py", line 10, in <module> re_path(r'^.*$',listfunc()), TypeError: listfunc() missing 1 required positional argument: 'request' このようなエラーが出てきます…。
Lhankor_Mhy

2020/02/04 04:02

Django はあまり詳しくないですが、たぶん typo ありますよ。かっこいらないのでは?
YUMA-NAGAO

2020/02/04 04:51 編集

少し(20分くらい)、試してみます ()無しにしたときに、元に戻りました。 しかし、そうすると、記事内にある写真が見えなくなってしまいます…。
Lhankor_Mhy

2020/02/04 04:56

どうぞどうぞごゆっくり。 あと、タグのことですが、回答者はタグとタイトルを見て自分に答えられそうな質問かどうか判断しています。 なので、flaskタグをつけるのは自由だと思いますが、Djangoユーザーが「俺はflaskわからないから」とスルーするリスクは考慮しておいた方がいいんじゃないかと思いました。
YUMA-NAGAO

2020/02/04 09:22

そちらでした。 flaskのタグを消して、色々試してみました。 結果、自分の思っていた事をすることが出来ました!! 本当にありがとうございます!!
YUMA-NAGAO

2020/02/05 00:55

色々な意見をありがとうございます! 1つめのリンクで、私のやりたかった子てゃ実現することが出来ました。 そのため、ベストアンサーにしたいと考えています。 此方のコメントで、おっしゃっていただいた事をまとめていただけないでしょうか?
guest

回答1

0

自己解決

考えていないURL
https://teratail.com/questions/239341ajio@@gjoa@ujr@gaji
といったものを打ち込まれたときに、基本画面に戻るという実装方法は、下記です

1,Djangoの一番上の階層のurls.pyに移動する
2, urls.pyで、urlpatternsに[re_path(r'^.*$',RedirectView.as_view(url='/posts/')),]を追加する

Python

1urls.py 2 3from django.contrib import admin 4from django.urls import path, include,re_path 5from django.conf import settings 6from django.conf.urls.static import static 7from django.views.generic import RedirectView 8 9 10 11 12urlpatterns = [ 13 path('admin/', admin.site.urls), 14 path('', include('app.urls')),, 15]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)+ static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) 16urlpatterns+=[re_path(r'^.*$',RedirectView.as_view(url='/posts/')),]

このようにすると、変なURLが入力されたときにリダイレクトします。
リダイレクト先は、
[re_path(r'^.*$',RedirectView.as_view(url='/posts/')),]内の、
(url='/posts/')
posts/を変更すると、指定することが出来ます。

投稿2020/02/12 23:53

YUMA-NAGAO

総合スコア41

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問