I experimented with making my URLs more dynamic, and ended up breaking something. I can figure it out for the life of me! Any help would be greatly appreciated. The only URLs working are my login and logout templates. I get why those are working, but what am I doing wrong for the rest of my URLs?
Here's the traceback I'm receiving:
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
Here are my views:
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)
My URLs:
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')
]
Here's my middleware:
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)
The render function takes two required argumernts.
From the docs,
render(request, template_name, context=None, content_type=None, status=None, using=None)[source]
Combines a given template with a given context dictionary and returns an HttpResponse object with that rendered text.
Required arguments
request
The request object used to generate this response.
template_name
The full name of a template to use or sequence of template names. If a sequence is given, the first template that exists will be used. See the template loading documentation for more information on how templates are found.
So, you need to add the template_name in the function, not the namespace of the url.
Edit your views,
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)