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

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

ただいまの
回答率

87.49%

djangoのtemplete,urlsに関するエラー。index.htmlが開けない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,016

score 21

ただいま、djangoのチュートリアルを真似て、オリジナルのwebアプリケーションを作りながら勉強中の初心者です。
機能としてはslackapiを使ってリプの多いスレッドを取り出してdbに保存、表示するものです。

from django.db import models


class ParentThread(models.Model):
    text = models.CharField(max_length=3000)
    ParentUser = models.CharField(max_length=20)
    # thread_ts = models.Charafield()
    def __str__(self):
        return self.text


class ReplyThread(models.Model):
    text = models.CharField(max_length=3000)
    parentthread = models.ForeignKey(ParentThread,on_delete=models.CASCADE,null=True)
    ReplyUser = models.CharField(max_length=20)
    def __str__(self):
        return self.text


という感じでモデルを作っています。
そこでindex.htmlからスレッドのtextをクリックするとdetail.htmlにとびリプが見られる感じです。そこで下のような感じでview,urls,templeteを書いたところ

from django.shortcuts import render
from django.http import HttpResponse
from .models import ParentThread,ReplyThread

def index(request):
    parent_thread_list = ParentThread.objects
    context = {'parent_thread_list': parent_thread_list}
    return render(request,'timeline_memory/index.html',context)


def detail(request,parentthread_id):
    parentthread =  ParentThread.objects.get(pk=parentthread_id)
    context = {'parentthread': parentthread}
    return render(request,'timeline_memory/detail.html',context)

import requests
import json
from datetime import *

SLACK_CHANNEL_ID = '********'
SLACK_URL = "https://slack.com/api/channels.history"
SLACK_URL2 = "https://slack.com/api/channels.replies"
TOKEN = "*************************************************"
ts_list = []

def select_thread():
    payload = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN
    }
    response = requests.get(SLACK_URL, params=payload)
    json_data = response.json()
    msgs = json_data['messages']
    for i in msgs:
        if 'reply_count' in i:
            # if i['reply_count'] > 5:
            ts_list.insert(0,i['ts'])

#↑返信件数の多いスレッドのtsを取得


def get_reply(TIMESTAMP):
    payload2 = {
        "channel": SLACK_CHANNEL_ID,
        "token": TOKEN,
        "thread_ts": TIMESTAMP
    }

    response2 = requests.get(SLACK_URL2, params=payload2)
    json_data2 = response2.json()
    msgs2 = json_data2['messages']
    for i in msgs2:
        if 'reply_count' in i:
            thread = ParentThread(text=i['text'],ParentUser=i['user'])
            thread.save()
        else:
            thread.replythread_set.create(text=i['text'],ReplyUser=i['user'])




def act(request):

    # if __name__ == '__main__':
    select_thread()
    for i in ts_list:
        get_reply(i)
    return HttpResponse('succes.')    
from django.urls import path
from . import views

app_name = 'timeline_memory'
urlpatterns = [
    path('', views.index, name='index',),
    path('<int:parentthread_id>/', views.detail, name='detail',),
    path('act', views.act, name='act',),
]
<ul>
    {% for thread in parent_thread_list.all %}
    <li><a href="{% url 'timeline_memory:detail' parentthread.id %}">{{thread}}</a></li>
    {% endfor %}
</ul>
<h1>{{parentthread.text}}</h1>
<ol>
    {%for reply in parentthread.replythread_set.all%}
    <li>{reply.text}</li>
    {%endfor%}
</ol>
Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/timeline_memory/

Django Version: 2.1.7
Python Version: 3.7.2
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'timeline_memory.apps.TimelineMemoryConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\Users\temec\Documents\env1\django_practice\code_life_talk_memory\timeline_memory\templates\timeline_memory\index.html, error at line 3
   Reverse for 'detail' with arguments '('',)' not found. 1 pattern(s) tried: ['timeline_memory/(?P<parentthread_id>[0-9]+)/$']
   1 : <ul>
   2 :     {% for thread in parent_thread_list.all %}
   3 :     <li><a href=" {% url 'timeline_memory:detail' ParentThread.id %} ">{{thread}}</a></li>
   4 :     {% endfor %}
   5 : </ul>

Traceback:

File "C:\Users\temec\Documents\env1\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\core\handlers\base.py" in _get_response
  124.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\temec\Documents\env1\django_practice\code_life_talk_memory\timeline_memory\views.py" in index
  8.     return render(request,'timeline_memory/index.html',context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\loader.py" in render_to_string
  62.     return template.render(context, request)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\base.py" in render
  171.                     return self._render(context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\base.py" in _render
  163.         return self.nodelist.render(context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\base.py" in render
  937.                 bit = node.render_annotated(context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\defaulttags.py" in render
  209.                     nodelist.append(node.render_annotated(context))

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\base.py" in render_annotated
  904.             return self.render(context)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\template\defaulttags.py" in render
  442.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)

File "C:\Users\temec\Documents\env1\lib\site-packages\django\urls\base.py" in reverse
  90.     return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "C:\Users\temec\Documents\env1\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
  622.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /timeline_memory/
Exception Value: Reverse for 'detail' with arguments '('',)' not found. 1 pattern(s) tried: ['timeline_memory/(?P<parentthread_id>[0-9]+)/$']

index.htmlを表示させようとしてhttp://127.0.0.1:8000/timeline_memory/にアクセスすると、Reverse for 'detail' with arguments '('',)' not found. 1 pattern(s) tried: ['timeline_memory/(?P<parのエラーが出てしまいます。

django = 2.1.7です。

1日調べてもわからなかったので質問させていただきました。回答お願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

<ul>
    {% for thread in parent_thread_list.all %}
    <li><a href="{% url 'timeline_memory:detail' parentthread.id %}">{{thread}}</a></li>
    {% endfor %}
</ul>

detailに渡しているのがparentthread.idになっていますがこれに正しい値が入っていない気がします。
正しくはthread.idでそれぞれのthreadのIDを引数として渡すのが正しいのでは無いでしょうか。

<ul>
    {% for thread in parent_thread_list.all %}
    <li><a href="{% url 'timeline_memory:detail' thread.id %}">{{thread}}</a></li>
    {% endfor %}
</ul>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/24 16:52

    ありがとうございました!無事解決いたしました!

    キャンセル

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

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

関連した質問

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