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

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

ただいまの
回答率

88.09%

ルートのURLに自身が作成したプロジェクトの対応がうまくいかない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,794

score 50

現状

現在Python3系、Django2.1.2で開発をしようと思いまして、ルートのURLにアクセスできるようにしています。
プロジェクト名はsampleという名前なので/sampleにアクセスしたらトップページが出るようなイメージです。

現状のコード

views.py

from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse('Hello!!')

urls.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^sample/', include('sample.urls'))
    url(r'^admin/', admin.site.urls),
]

問題点

/sampleにアクセスするとPage not foundになります。
おそらく初歩的なミスを犯していると思われますが、なにぶん初めて触るのでよくわかりません。

この問題が解決したら基礎の勉強をしたいと思っています。
とりあえずルートにアクセスできるようにはしてみたいという考えからこのようなことを行なっています。

  1. どう対処すればいいのか教えて頂きたいです。

追記

構成

mysite #ディレクトリ
    mysite #ディレクトリ
        _pycache_ #ディレクトリ
        _init_.py
        settings.py
        url.py
        wsgi.py
    sample #ディレクトリ
        migrations #ディレクトリ
        _init_.py
        admin.py
        apps.py
        tests.py
        urls.py
        views.py
        db.sqlite3
        manage.py

mysite/sample/urls.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^sample/', include('sample.urls'))
    url(r'^admin/', admin.site.urls)
    path('sample/', views.index, name='index'),
]


回答をもらいまして、上記のように記載しましたが、
localhost/sampleにアクセスすると404が発生してしまいます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Udomomo

    2018/10/03 15:40

    sample/urls.pyには何を記載していますか?

    キャンセル

  • Tatsuo_Iriyama

    2018/10/03 16:03

    sample/urls.pyに記載されている内容が現状のコードで掲載しているurls.pyになります。

    キャンセル

  • Udomomo

    2018/10/03 16:17 編集

    これ以外に、上位や下位のディレクトリにurls.pyはありますか?プロジェクトのディレクトリ構成を知りたいです。

    キャンセル

  • Tatsuo_Iriyama

    2018/10/03 16:26

    追記の方に構成を記載致しました。

    キャンセル

回答 2

checkベストアンサー

+1

それぞれのファイルに以下にように書く必要があります。
(urlspattern内の当該部分以外は省略してあります)

# mysite/urls.py
url(r'^sample/', include('sample.urls'))

# mysite/sample/urls.py
url(r'^content/', views.index)

その後/sample/content/にアクセスします。

---追記---
ディレクトリ構成が並列になっているんですね。

# mysite/sample/urls.py
path('sample/', views.index, name='index')


としてください。

---再追記---
やっと手元で動作確認できる環境に来ました。

settings.pyのROOT_URLCONFと、mysite/mysite/urls.pyには何が書いてありますか?
もし初期設定のままであれば、djangoはmysite/mysite/urls.pyの内容を先に読み込みます。
そのため、mysite/sample/urls.pyには以下のように記載すれば良いです。

from django.urls import path
from myapp.views import IndexView

urlpatterns = [
    path('', IndexView.as_view(), name='index'),
]

この状態で、localhost:8080/sample/でページを開けると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/09 08:48 編集

    追記ありがとうございます。
    現状mysite/sample/urls.pyには
    from django.urls import path
    from myapp.views import IndexView

    urlpatterns = [
    path('', IndexView.as_view(), name='index'),
    ]

    mysite/mysite/settings.pyのROOT_URLCONFには
    ROOT_URLCONF = 'mysite.urls'

    mysite/mysite/urls.pyには
    from django.contrib import admin
    from django.urls import path

    urlpatterns = [
    path('admin/', admin.site.urls),
    ]

    と記載しています。
    アクセス先は、http://127.0.0.1:18000にアクセスするとDjangoの初期画面が表示される形です。
    http://127.0.0.1:18000/sample/にアクセスすると、404が表示されます。

    環境構築は、https://qiita.com/192_60_33_2/items/73df25e2dd64217165ae
    こちらを参考に行いました。
    Djangoのサーバーを起動させる時のコマンドは、
    python3 manage.py runserver 0:8000
    になります。

    追記分を記載してもアクセス出来ないが謎です。
    時間がかかってしまい、申し訳ありません。

    キャンセル

  • 2018/10/09 09:32

    mysite/mysite/urls.pyの記述が足りないです。これだとmysite/sample/urls.pyを見に行ってくれません。
    urlpatternsの中に、path('sample/', include('sample.urls'))を追加しましょう。includeをインポートするのも忘れないでくださいね。
    詳しくはこのページを参考にしてください。
    https://docs.djangoproject.com/ja/2.1/intro/tutorial01/#write-your-first-view

    キャンセル

  • 2018/10/11 13:29

    参考ページを元にビューを作成する事ができました!
    長々と教えて頂きありがとうございます、助かりました!

    キャンセル

+1

 解決法

シンタックスが違います。
Django2.xではURLの設定に正規表現ではなく文字列を使うようになりました。
つまり

url(r'^sample/', include('sample.urls'))

ではなく

path('sample/', views.index),

でURLを設定します。sampleを表示するだけであれば name は必要ありません。

当然ですがこの path() とはDjangoの組み込みメソッドでありどこにも定義されていないので、同じファイル内で import する必要があります。よってファイル文頭に

from django.urls import path

を足してください。

 余談

おそらくDjango1.xのtutorialを見ているので気を付けましょう。Django2でも大部分で変更はありませんが、今回のようなシンタックスの違いがあったりします。
公式チュートリアルやほかにもDjangoGirls など日本語も整備された良いチュートリアルがたくさんありますのでそちらを一通りこなすことをお勧めします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/09 08:52

    回答ありがとうございます。

    Python2.x系に関してだと思われるのですが、
    プロジェクトを立ち上げる際に
    python3 manage.py startapp sample
    のコマンドで立ち上げたので、私が今立ち上げているプロジェクトはPython3.x系なのでしょうか?
    だとしたらこの記載は正しいでしょうか?

    Python2.x系と1.x系で違いがある事は理解しましたが、3.x系との違いはあるのでしょうか?

    ちなみに回答されたコードを記載してアクセスして見ましたが、出来ませんでした。
    アクセス先は、http://127.0.0.1:18000/sample/になります。
    エラーは404です。

    キャンセル

  • 2018/10/09 09:05

    質問について
    正しいと思います。python3.x/Django2.xでしょう。多分なんですが、Django2.xはpython2.xには対応していないかと
    アプリ追加のコマンドも正しいです。python2とpython3ではそこそこ変更点があります。ただDjangoの最新のチュートリアルは全てpython3の文法で書かれていますので気にしなくても大丈夫です。

    キャンセル

  • 2018/10/09 09:28

    404について
    書き直すディレクトリを指定していませんでした。すみませんでした。
    1 . mysite/urls.py の urlpatterns に「path('polls/', include('polls.urls')),」
    を追加してください。もちろん path, include のimportを忘れないようにしてください。
    2. 次に sample/urls.py の urlpatterns に「path('sample/', views.index),」を足してください。
    ※ pathのimportに加えて、 「from . import views」で同じsampleディレクトリのviews.pyをimportしてください。でないと、views.indexが認識されません。

    これで動くはずですが、もし動かない場合はDjango1.x系の行を削除してください( url(r'', ...) の箇所です)。
    何故こう記述するかは是非チュートリアルをやってみてください

    キャンセル

  • 2018/10/11 13:29

    追記ありがとうございます。助かりました。
    チュートリアルの存在知りませんでした、ありがとうございます。
    ぜひやってみようと思います

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る