首页 > 解决方案 > Django TemplateDoesNotExist 在 /

问题描述

我目前正在尝试使用 Django 构建一个打赏游戏应用程序。我是 Django 新手,这是我的第一个应用程序。我在 GitHub https://github.com/kdungs/tippspiel上找到了一个已经存在的“模板”,并想根据我的目的对其进行调整。如果我运行 manage.py runserver,我会得到以下信息:

TemplateDoesNotExist at /
{'player': <Player: Player object (1)>, 'top_players': <QuerySet [<Player: Player object (1)>]>, 'upcoming_matchdays': <filter object at 0x10d5b4c50>}
Request Method: GET
Request URL:    http://127.0.0.1:8000/
Django Version: 2.0.4
Exception Type: TemplateDoesNotExist
Exception Value:    
{'player': <Player: Player object (1)>, 'top_players': <QuerySet [<Player: Player object (1)>]>, 'upcoming_matchdays': <filter object at 0x10d5b4c50>}
Exception Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/template/loader.py in get_template, line 19
Python Executable:  /Library/Frameworks/Python.framework/Versions/3.6/bin/python3
Python Version: 3.6.5
Python Path:    
['/Users/constantinkurz/Desktop/wm2018',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']
Server time:    So, 27 Mai 2018 13:01:14 +0200

这也是我的 Settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'tippspiel',
]

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',
]

ROOT_URLCONF = 'mysite.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'tippspiel/templates/tippspiel')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'mysite.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/

LANGUAGE_CODE = 'de-ch'

TIME_ZONE = 'Europe/Berlin'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
AUTH_PROFILE_MODULE = 'tippspiel.Player'

网址.py:

from django.conf.urls import *
from django.contrib.auth import views as auth_views
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.auth.decorators import login_required
from django.views.generic import DetailView, ListView, TemplateView
from tippspiel.views import overview, matchday_detail, match_detail, settings, update_scores_and_ranks, player_detail
from tippspiel.models import Player, Team, Match, Tipp


urlpatterns = [
    url(
        r'^login/$',
        auth_views.login,
        {
            'template_name': 'tippspiel/login.html'
        },
        name="login"
    ),

    url(
        r'^logout/$',
        auth_views.logout_then_login,
        name="logout"
    ),

    url(
        r'^changepw/$',
        auth_views.password_change,
        {
            'template_name': 'tippspiel/password_change.html',
            'post_change_redirect' : '/tippspiel/settings/'
        },
        name="password_change"
    ),
]

urlpatterns += [
    url(
        r'^$',
        overview,
        name="tippspiel_overview"
    ),

    url(
        r'^matchdays/$',
        login_required(ListView.as_view(
            queryset=range(1, 35),
            context_object_name='matchdays',
            template_name='tippspiel/matchday_list.html'
        )),
        name="tippspiel_matchday_list"
    ),

    url(
        r'^matchday/(?P<matchday_number>\d+)/$',
        matchday_detail,
        name="tippspiel_matchday_detail"
    ),

    url(
        r'^matches/$',
        login_required(ListView.as_view(
            queryset=Match.objects.order_by('date'),
            context_object_name='matches'
        )),
        name='tippspiel_match_list'
    ),

    url(
        r'^match/(?P<match_id>\d+)/$',
        match_detail,
        name="tippspiel_match_detail"
    ),

    url(
        r'^ranking/$',
        login_required(ListView.as_view(
            queryset=Player.objects.order_by('-score', 'user__username'),
            context_object_name='players',
            template_name='tippspiel/player_list.html'
        )),
        name="tippspiel_player_list"
    ),

    url(
        r'^player/(?P<player_name>\w+)/$',
        player_detail,
        name="tippspiel_player_detail"
    ),

    url(
        r'^settings/$',
        settings,
        name="tippspiel_settings"
    ),

    url(
        r'update_scores_and_ranks/$',
        update_scores_and_ranks,
        name="tippspiel_staff_update_scores_and_ranks"
    ),

]

视图.py:

from django.contrib.auth.decorators import login_required
from django.contrib.admin.views.decorators import staff_member_required
from django.http import HttpResponseRedirect, Http404
from django.shortcuts import get_object_or_404
from django.shortcuts import render
from django.template import RequestContext
from django.utils import timezone
from django.views.decorators.csrf import csrf_protect
from tippspiel.models import Player, Team, Match, Tipp

import re


@login_required
def overview(request):
    player = get_object_or_404(Player, user=request.user)
    top_players = Player.objects.order_by('-score', 'user__username')[:3]
    upcoming_matchday = Match.objects.filter(date__gt=timezone.now()).order_by('date')[0].matchday
    upcoming_matchdays = filter(lambda x: x < 35, [upcoming_matchday + i for i in (0, 1, 2)])
    return render(
        'tippspiel/overview.html',
        {
            'player': player,
            'top_players': top_players,
           'upcoming_matchdays': upcoming_matchdays
        }
    )


@login_required
@csrf_protect
def matchday_detail(request, matchday_number):
    m_nr = int(matchday_number)
    if m_nr < 1 or m_nr > 34:
        # testing
        if m_nr != 0:
            raise Http404

    if request.method == 'POST':
        for k, v in request.POST.items():
            if k.startswith('Tipp-'):
                try:
                    match_id = int(k.strip('Tipp-'))
                except:
                    raise Http404
                m = re.match(r'^(?P<score_home>\d+):(?P<score_visitor>\d+)$', v)
                if m:
                    match = get_object_or_404(Match, pk=match_id)
                    if not match.has_started():
                        try:
                            tipp = Tipp.objects.get(player__user=request.user, match__id=match_id)
                        except:
                            tipp = None
                        score_home = m.group('score_home')
                        score_visitor = m.group('score_visitor')
                        if tipp:
                            tipp.date = timezone.now()
                            tipp.score_home = score_home
                            tipp.score_visitor = score_visitor
                        else:
                            tipp = Tipp(
                                player=Player.objects.get(pk=request.user.pk),
                                match=match,
                                date=timezone.now(),
                                score_home=score_home,
                                score_visitor=score_visitor
                            )
                        tipp.save()
        return HttpResponseRedirect(reverse("tippspiel_matchday_detail", kwargs={'matchday_number':m_nr}))

    matches = Match.objects.filter(matchday=m_nr)
    tipps = Tipp.objects.filter(player__user=request.user).filter(match__matchday=m_nr)
    tipps_by_matches = {t.match.pk: t for t in tipps}

    return render(
        'tippspiel/matchday_detail.html',
        {
            'number': m_nr,
            'matches': matches,
            'tipps': tipps_by_matches
        },
        context=RequestContext(request)
    )


@login_required
def match_detail(request, match_id):
    match = get_object_or_404(Match, pk=match_id)
    tipps = None
    if match.has_started():
        tipps = Tipp.objects.filter(match=match).order_by('player__rank')
    return render(
        'tippspiel/match_detail.html',
        {
            'match': match,
            'tipps': tipps
        },
        context_instance=RequestContext(request)
    )


@login_required
def player_detail(request, player_name):
    p = get_object_or_404(Player, user__username=player_name)
    return render(
        'tippspiel/player_detail.html',
        {
            'player': p
        },
        context=RequestContext(request)
    )

@login_required
def settings(request):
    errors = []
    if request.method == 'POST':
        npw = 1
        npw_c = 1
    return render(
        'tippspiel/settings.html',
        {
            'errors': errors
        },
        context=RequestContext(request)
    )


@staff_member_required
def update_scores_and_ranks(request):
    # update scores
    for player in Player.objects.all():
        player.update_score()
        player.save()

    # update ranks
    players = Player.objects.all().order_by('score').reverse()
    rank, tick, score = 1, 0, players[0].score
    for player in players:
        if player.score < score:
            rank += tick
            tick = 1
            score = player.score
        else:
            tick += 1
        if player.rank != rank:
            player.rank = rank
            player.save()

    return HttpResponseRedirect(reverse('tippspiel_settings'))

和目录:

应用程序目录

我知道已经有很多关于这个错误的帖子,但是没有一个可以帮助我弄清楚这里到底出了什么问题。

谢谢你的帮助

标签: pythondjango

解决方案


对于 settings.py 中的模板 DIR,请尝试: 'DIRS': ['templates'], 而不是: 'DIRS': [os.path.join(BASE_DIR, 'tippspiel/templates/tippspiel')],


推荐阅读