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

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

ただいまの
回答率

89.64%

djangoでリンクを貼りたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 938

Windows 10
Python 3.7.3

Djangoでリンクの設定をしたいのですが、これらを書いた後にpython manage.py runserverでサーバーを動かそうとするとエラーが表示されサーバーが動きません。

views.py

def index(request):
    return render(request,'index.html')

def hello(request):
    return render(request, 'hello.html')


project/urls.py

from django.conf.urls import url

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

    url('', include(('app.urls', 'hello'), namespace='hello')),
]


app/urls.py

from django.conf.urls import url

urlpatterns = [
    path('', views.index, name='index'),

    url('', view.hello, name='hello'),
]


index.html

<a href="{% url 'hello:hello' %}">Hello World!</a>

<a href="{% url 'hello' %}">Hello World!</a>

これらを書かなければサーバーは動きます。

何か書き方がおかしいのでしょうか?

やりたい事はシンプルにリンクを貼りたいだけです。

今の状態はindex.htmlと同じ階層にhello.htmlが入っています。

project\app\templates\hello.html

テラテイルやいろんなサイトを見たのですがなかなか解決が出来ずに困っています。

app/urls.pyを使わずにproject/urls.pyに直接

path('', views.hello, name='hello'),

と書いたりしても動かず、この部分にSyntaxError: invalid syntaxというエラーが出ています。

何か書き方がおかしいのだと思います。

試しに

url('', include(('app.urls', 'hello'), namespace='hello')),

と書いても表示されません。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

以下のように各urls.pyを変更して試してみてください。
これは自分の方法ですので他のやり方も当然あると思います。

project/urls.py

from django.urls import path
    # pathをimportするだけで十分です。

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app.urls')),
    # includeを使う場合はnamespaceは子urls.pyで定義する
    # urlpatterns内はpathを書くだけでやりたいことは実現できます。
    # 逆にurlを入れる方法を私は知りません。勉強不足なだけかもしれませんが。

]
app/urls.py

from django.urls import path

app_name ="hello"  #point
    # これがproject.urlsのnamespaceの役割を果たします。

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

hoge.htmlの編集

<a href="{% url 'hello:index'  %}">HOGE</a>

こんな感じで書いてみてください。
今回はurlpatternsの中に書くべきものをpathだけにすること。
親urls.pyの場合はincludeを使いnamespaceは子urls.pyにてapp_nameを使い定義する。
これがポイントだと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/08 15:33

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

    そうするとこの次からまた別のリンクを足す場合には、
    どのように足していけばいいかお分かりになりますでしょうか?

    例えばservice.htmlやprice.htmlというファイルがまだ別にあって、そこまで飛ばす書き方が分からずで困っています。

    Djangoはインターネット上で情報を探すのが難しくて、もしくはいろいろと試してもエラーばかりで。

    不慣れで申し訳ありません。

    キャンセル

  • 2019/04/08 17:19

    ではゴールから逆算して考えてみましょう。
    price.htmlに飛ばす。飛ばすためには先程作ったhoge.html内にprice.htmlにとばすリンクを作成することで解決できそうです。ではリンクの作り方ですが、今回は{% url "namespace:name" %}の形で作成します。リンクの書き方は他にもあります。これが楽だと思いますが、その他の方法はご自分でフォローしてください。リンクの要素としてnamespace,nameを定めなければなりませんね。namespaceはapp_nameとして、nameはpath内で共に子urls.py(app.urls.py)で定めることになりそうです。namespaceはproductsというアプリをpython manage.py startapp productsで作ることになると想像できます。
    また子urls.pyに飛ばす親urls.pyもpathの追加が必要そうです。

    ```python
    hoge.htmlにて
    <a href="{% url 'hello:index' %}">HOGE</a>
    <a href="{% url 'products:product' %}">gogogo</a>
    #新しく追加したprice.htmlはproductsに作るものとします。
    ```
    親から子(productsアプリ)に通すパス
    ```python
    project/urls.py

    from django.urls import path
    # pathをimportするだけで十分です。

    urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('app.urls')),
    path('pro/', include("products.urls")), #追加
    # path第一引数は,すでにあるものとかぶらないようにする。
    ]
    ```
    子(productsアプリ)からviewsの関数に渡すpathを作成。
    ここでnamespaceとnameを設定することがポイントです。

    ```python
    products/urls.py

    from django.urls import path
    from .views import example

    app_name ="products"
    # これでhoge.htmlのnamespaceは準備できました。

    urlpatterns = [
    path('foo', example, name="product"),
    ]
    #これでnameの方も準備できました。
    ```
    あとは適当にproducts.views.pyでprice.htmlを渡す関数を書いてあげればokです。例えば、、、
    ```python
    products.views.py

    from django.shortcuts import render

    def example(request):
    render(request, "products/price.html")
    ```

    こんな感じの流れで考えなければなりません。なれると必要ありませんが。
    今回かいたコードでurls.pyの関数呼び出しにエラーが出るかもしれません。
    少し曖昧な部分があって頻繁に書き直すところです。。。もし出たら教えてください。
    不明な所があれば質問よろしくおねがいします。

    キャンセル

  • 2019/04/08 20:41

    本当にとても親切に教えていただきありがとうございます!
    本当に感謝しています。
    ただ、今の私にはちょっと理解の難しい内容のようでして、また再度一から勉強をしなおさなければと考えています。
    この度は本当にありがとうございました!

    キャンセル

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

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