我目前正在尝试使用Django构建一个小费游戏应用程序。我是Django的新手,这是我的第一个App。我找到了一个已经存在的"模板"在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'
Urls.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"
),
]
views.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'))
和dir:
我知道有很多关于这个错误的帖子,但是没有一个可以帮我弄清楚这里究竟出了什么问题。
感谢您的帮助
答案 0 :(得分:0)
对于settings.py中的模板DIR,请尝试:
'DIRS': ['templates'],
代替:
'DIRS': [os.path.join(BASE_DIR, 'tippspiel/templates/tippspiel')],