在/ lab /的TemplateDoesNotExist

时间:2017-05-06 13:13:06

标签: python django django-templates

在dashboar.html中,我扩展了base.html,它会在/ lab /中弹出TemplateDoesNotExist的错误,如果我输出{%extends“base.html”%},它可以正常工作,我的base.html确实存在问题。

这是我的目录

mysite/
  lab/
    templates/
      lab/
        base.html
        dashboard.html
        details/
          index.html
          login.html
    __init__.py
    # views.py; models.py etc.

base.html文件

<div id="header">
    <span class="logo">Bookmarks</span>
    {% if request.user.is_authenticated %} <ul class="menu">
        <li {% if section =="dashboard" %}class="selected"{% endif %}>
            <a href="{% url 'dashboard' %}">My dashboard</a>
        </li>
        <li {% if section =="images" %}class="selected"{% endif %}>
            <a href="#">Images</a>
        </li>
        <li {% if section =="people" %}class="selected"{% endif %}>
            <a href="#">People</a>
        </li> </ul> {% endif %}
    <span class="user">
{% if request.user.is_authenticated %}
    Hello {{ request.user.first_name }},
    <a href="{% url 'logout' %}">Logout</a>
    {% else %}
    <a href="{% url 'login' %}">Log-in</a>
    {% endif %}
    </span>
</div>

dashboard.html

{% extends "base.html" %}
{% block title %}Dashboard{% endblock %}
{% block content %}
    <h1>Dashboard</h1>
    <p>Welcome to your dashboard.</p>
{% endblock %}

views.py

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .forms import LoginForm
from django.contrib.auth.decorators import login_required
from .models import User, Device


def lab_list(request):
    return render(request, 'lab/details/index.html')


def user_login(request):

    if request.method == 'POST':

        form = LoginForm(request.POST)

        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(username=cd['username'],
                                password=cd['password'])
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return HttpResponse('Authenticated '' Successfully')
                else:
                    return HttpResponse('Disabled account')
            else:
                return HttpResponse('Invalid login')
    else:
        form = LoginForm()

    return render(request, 'lab/details/login.html', {'form': form})


@login_required
def dashboard(request):
    return render(request, 'lab/dashboard.html', {'section': 'dashboard'})

登记/ login.html的

{% extends "lab/base.html" %}

{% block content %}
    <h1>Log-in</h1>
{% if form.errors %}
<p>
    your username and password didn't match.
    Please try again.
</p>
{% else %}
<p>Please, use the following from to log-in</p>
{% endif %}
<div class="login-form">
    <form action="{% url 'login' %}" method="post">
        {{ form.as_p }}
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ next }}" />
        <p><input type="submit" value="Log-in"></p>
    </form>
</div>
{% endblock %}

登记/ logged_out.html

{% extends "lab/base.html" %}
{% block title %}Logged out{% endblock %}
{% block content %}
<h1>Logged out</h1>
<p>You have been successfully logged out. You can <a href="{% url 'login' %}">log-in again</a>.</p>
{% endblock %}

模板/实验室/ details.html

{% extends "lab/base.html" %}

{% block title %}
    Login
{% endblock %}

{% block content %}
    <h1>Log-in</h1>
    <form action="." method="post">
            {{ form.as_p }}
            {% csrf_token %}
            <input type="submit" value="登陆">
    </form>
{% endblock %}

urls.py

from django.conf.urls import url
from . import views
from django.contrib.auth.views import login, logout, logout_then_login

urlpatterns = [
    # post views
    url(r'^login/$', login, name='login'),
    url(r'^logout/$', logout, name='logout'),
    url(r'^logout-then-login/$', logout_then_login, name='logout_then_login'),
    url(r'^$', views.dashboard, name='dashboard'),
]

更新

我已经在settings.py

中添加了以下内容
LOGIN_REDIRECT_URL = reverse_lazy('dashboard') 
LOGIN_URL = reverse_lazy('login')
LOGOUT_URL = reverse_lazy('logout')

1 个答案:

答案 0 :(得分:1)

解决方案:像这样扩展基本模板:{% extends 'lab/base.html' %}

<强>解释

如果你只写{% extends 'base.html' %},Django会在lab/templates/中寻找base.html。但是这个目录中没有任何内容。

实际上,base.html位于lab/templates/lab/目录中。这就是为什么,您需要指定包含base.html

的app目录的名称