TemplateDoesNotExist в /account/

Я экспериментировал с тем, чтобы сделать свои URL более динамичными, и в итоге что-то сломал. Я могу понять это для моей жизни! Любая помощь будет принята с благодарностью. Работают только URL-адреса - мои шаблоны входа и выхода. Я понимаю, почему они работают, но что я делаю неправильно для остальных моих URL?

Вот обратная связь, которую я получаю:

Traceback (most recent call last):
  File "/Users/m.zayas/Desktop/env1/lib/python2.7/site-packages/django/core/handlers/exception.py", line 39, in inner
    response = get_response(request)
  File "/xxxxx/env1/lib/python2.7/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/xxxxx/env1/lib/python2.7/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/m.zayas/Desktop/env1/diversely/accounts/views.py", line 20, in home
    return render(request, 'accounts:home')
  File "/xxxxx/env1/lib/python2.7/site-packages/django/shortcuts.py", line 30, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/xxxxx/env1/lib/python2.7/site-packages/django/template/loader.py", line 67, in render_to_string
    template = get_template(template_name, using=using)
  File "/xxxxx/env1/lib/python2.7/site-packages/django/template/loader.py", line 25, in get_template
    raise TemplateDoesNotExist(template_name, chain=chain)
TemplateDoesNotExist: accounts:home
[03/Jun/2017 03:15:17] "GET /account/ HTTP/1.1" 500 78337

Вот мои взгляды:

from django.shortcuts import render, redirect
from django.urls import reverse
from accounts.forms import (
    RegistrationForm,
    EditProfileForm
)
from django.contrib.auth.models import User
from django.contrib.auth.forms import (
    UserChangeForm,
    PasswordChangeForm
)
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required

# Create your views here.

def home(request):
    name = 'Matthew Zayas'
    args = {'myName': name}
    return render(request, 'accounts:home')

def register(request):
    if request.method =='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:home'))
    else:
        form = RegistrationForm()

        args = {'form': form}
        return render(request, 'accounts:register', args)

def view_profile(request):
    args = {'user': request.user}
    return render(request, 'accounts:view_profile', args)

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)

        if form.is_valid:
            form.save()
            return redirect('accounts:view_profile')
    else:
        form = EditProfileForm(instance=request.user)
        args = {'form': form}
        return render(request, 'accounts:edit_profile', args)

def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
            return redirect('accounts:view_profile')
        else:
            return redirect('accounts:change_password')
    else:
        form = PasswordChangeForm(user=request.user)
        args = {'form': form}
        return render(request, 'accounts:change_password', args)

Мои URL:

from django.conf.urls import url
from . import views
from django.contrib.auth.views import (
        login,
        logout,
        password_reset,
        password_reset_done,
        password_reset_confirm,
        password_reset_complete
)

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^login/$', login, {'template_name': 'accounts/login.html'}, name='login'),
    url(r'^logout/$', logout, {'template_name': 'accounts/logout.html'}, name='logout'),
    url(r'^register/$', views.register, name='register'),
    url(r'^profile/$', views.view_profile, name='view_profile'),
    url(r'^profile/edit$', views.edit_profile, name='edit_profile'),
    url(r'^change-password/$', views.change_password, name='change_password'),
    url(r'^reset-password/$', password_reset, {'template_name': 'accounts/reset_password.html'}, name='reset_password'),
    url(r'^reset-password/done/$', password_reset_done, name='password_reset_done'),
    url(r'^reset-password/confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$', password_reset_confirm, name='password_reset_confirm'),
    url(r'^reset-password/complete$', password_reset_complete, name='password_reset_complete')
]

Вот мое промежуточное ПО:

import re

from django.conf import settings
from django.urls import reverse
from django.shortcuts import redirect
from django.contrib.auth import logout

EXEMPT_URLS = [re.compile(settings.LOGIN_URL.lstrip('/'))]
if hasattr(settings, 'LOGIN_EXEMPT_URLS'):
    EXEMPT_URLS += [re.compile(url) for url in settings.LOGIN_EXEMPT_URLS]

class LoginRequiredMiddleware:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):
        assert hasattr(request, 'user')
        path = request.path_info.lstrip('/')    
        url_is_exempt = any(url.match(path) for url in EXEMPT_URLS)

        if path == reverse('accounts:logout').lstrip('/'):
            logout(request)

        if request.user.is_authenticated() and url_is_exempt:
            return redirect(settings.LOGIN_REDIRECT_URL)
        elif request.user.is_authenticated() or url_is_exempt:
            return None
        else:
            return redirect(settings.LOGIN_URL)

2 ответа

Решение

Функция рендеринга принимает два обязательных аргумента.

Из документов,

визуализация (запрос, имя шаблона, контекст = нет, тип содержимого = нет, статус = нет, использование = нет)[источник]

Объединяет данный шаблон с заданным контекстным словарем и возвращает объект HttpResponse с этим отображаемым текстом.

Обязательные аргументы

запрос

Объект запроса, используемый для генерации этого ответа.

Имя Шаблона

Полное имя используемого шаблона или последовательность имен шаблонов. Если задана последовательность, будет использован первый существующий шаблон. См. Документацию по загрузке шаблонов для получения дополнительной информации о том, как найти шаблоны.

Таким образом, вам нужно добавить имя шаблона в функцию, а не пространство имен URL.

Редактировать ваши взгляды,

def home(request):
    name = 'Matthew Zayas'
    args = {'myName': name}
    #add the full name of the template and the 
    #context variables you want to add.
    return render(request, 'accounts/home.html', args)

def register(request):
    if request.method =='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect(reverse('accounts:home'))
    else:
        form = RegistrationForm()
    args = {'form': form}
    #here tooo..
    return render(request, 'accounts/register.html', args)

def view_profile(request):
    args = {'user': request.user}
    #same here..
    return render(request, 'accounts/view_profile.html', args)

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)

        if form.is_valid:
            form.save()
            return redirect('accounts:view_profile')
    else:
        form = EditProfileForm(instance=request.user)
    args = {'form': form}
    return render(request, 'accounts/edit_profile.html', args)

def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
            return redirect('accounts:view_profile')
        else:
            return redirect('accounts:change_password')
    else:
        form = PasswordChangeForm(user=request.user)
    args = {'form': form}
    #same thing here too
    return render(request, 'accounts/change_password.html', args)

Похоже, вы забыли включить функцию обратного просмотра.

Ваш код

def home(request):
name = 'Matthew Zayas'
args = {'myName': name}
return render(request, 'accounts:home')

Изменения должны быть сделаны

def home(request):
name = 'Matthew Zayas'
args = {'myName': name}
return render(request, reverse('accounts:home'))

Надеюсь это поможет.

Перейдите в файл "settings.py" в каталоге вашего проекта и измените шаблон DIRS:[]

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': ['templates'],
    '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',
        ],
    },
},

]

Другие вопросы по тегам