2017-06-03 170 views
1

我嘗試使我的網址更具動態性,並最終破壞了某些內容。我可以想象出我的生活!任何幫助將不勝感激。唯一可以使用的URL是我的登錄和註銷模板。我明白爲什麼這些工作正常,但是我的其他網址的做法有什麼問題?TemplateDoesNotExist at/account/

下面是我收到的回溯:

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) 

我的網址:

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) 

回答

0

render函數需要兩個必需的論證。

從文檔,

渲染(請求,TEMPLATE_NAME,上下文=無,CONTENT_TYPE =無,狀態=無,使用=無)[源]

結合了一個給定模板與一個給定的上下文字典並返回一個HttpResponse對象與該呈現的文本。

必需的參數

請求

用來生成此響應的請求對象。

TEMPLATE_NAME

一個模板的全名使用或模板的名稱序列。如果給出了一個序列,將使用存在的第一個模板。有關如何找到模板的更多信息,請參見template loading documentation

所以,你需要添加TEMPLATE_NAME的功能,而不是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) 
+0

謝謝!我完全忽略了我一直在使用渲染函數並匆匆編輯了所有URL以匹配命名空間的事實。 – mzayas

0

看起來您忘記了在視圖中包含反轉功能​​。

您的代碼

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')) 

希望這有助於。

+0

遺憾的是,沒有工作。任何其他想法? – mzayas

+0

同樣的錯誤會持續嗎?或者你有任何新的錯誤?根據django文檔https://docs.djangoproject.com/en/1.11/ref/urlresolvers/反向函數應該將模板位置從「account:home」轉換爲account/home.html –