selfboot
selfboot

Reputation: 1520

django TemplateDoesNotExist

I want to make a signup page, when user click signup, it will check if the two password are the same, when not, give a error message after "confirm password".

But when I call "return render(request, reverse("accounts:signup"), {'form': signup_form}) " in my views.py, it shows me an error, the traceback is:

Environment:

Request Method: POST
Request URL: http://127.0.0.1:8000/accounts/signup_post/

Django Version: 1.7
Python Version: 2.7.5
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'accounts')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')

Template Loader Error:
Django tried loading these templates, in this order:
Using loader django.template.loaders.filesystem.Loader:
Using loader django.template.loaders.app_directories.Loader:

Traceback:
File "/Users/feizhao/.virtualenvs/nahan/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/feizhao/dropbox/nahan/accounts/views.py" in signup_post
  64.     return render(request, reverse("accounts:signup"), {'form': signup_form})
File "/Users/feizhao/.virtualenvs/nahan/lib/python2.7/site-packages/django/shortcuts.py" in render
  48.     return HttpResponse(loader.render_to_string(*args, **kwargs),
File "/Users/feizhao/.virtualenvs/nahan/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  170.         t = get_template(template_name, dirs)
File "/Users/feizhao/.virtualenvs/nahan/lib/python2.7/site-packages/django/template/loader.py" in get_template
  144.     template, origin = find_template(template_name, dirs)
File "/Users/feizhao/.virtualenvs/nahan/lib/python2.7/site-packages/django/template/loader.py" in find_template
  136.     raise TemplateDoesNotExist(name)

Exception Type: TemplateDoesNotExist at /accounts/signup_post/
Exception Value: /accounts/signup/

my account app looks like:

$ tree -L 3 accounts
accounts
├── __init__.py
├── admin.py
├── forms.py
├── locale
│   └── zh_CN
├── migrations
│   ├── 0001_initial.py
│   ├── __init__.py
├── models.py
├── static
│   └── accounts
│       └── login.css
├── templates
│   └── accounts
│       ├── base.html
│       ├── login.html
│       └── signup.html
├── tests.py
├── urls.py
├── views.py

urls.py:

urlpatterns = patterns(
    '',
    url(r'^accounts/', include('accounts.urls', namespace="accounts")),
    url(r'^admin/', include(admin.site.urls)),
)

accounts/urls.py:

urlpatterns = patterns(
    '',
    url(r'^login/$', views.login, name='login'),
    url(r'^signup/$', views.signup, name='signup'),
    url(r'^login_post/$', views.login_post, name='login_post'),
    url(r'^signup_post/$', views.signup_post, name='signup_post'),
)

signup_post function in views.py:

def signup_post(request):
    if request.method == 'POST':
        signup_form = forms.SignupForm(request.POST)

        if signup_form.is_valid():
            signup_info = signup_form.cleaned_data
            username = signup_info['username']
            email = signup_info['email']
            password = signup_info['password_1']
            user = User.objects.create_user(
                username=username,
                email=email,
                password=password)
            user.save()

    else:
        signup_form = forms.SignupForm()

    return render(request, reverse("accounts:signup"), {'form': signup_form})

I have read Django TemplateDoesNotExist and other similar questions, but no help!

ps: I have asked another question about the signup, maybe usefull.

Upvotes: 1

Views: 4443

Answers (3)

Grin
Grin

Reputation: 31

The thing is that reverse() function returns url (from urls.py). So args to render() looks like this:

return render(request, '/signup/', {'form': signup_form}) # look at 'singup' path at url.py

You have to hardcode path to template.

return render(request, 'accounts/signup.html', {'form': signup_form})

Upvotes: 0

Prateek
Prateek

Reputation: 1556

You have to set the template dir path in your setings.py file, Please paste the code below in you settings.py file.

import os

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

TEMPLATE_DIRS = (
    os.path.join(PROJECT_PATH,'templates'),
)

As well as you have to pass the template name in the view when you return the response.

return render(request, 'accounts/signup.html', {'form': signup_form})

Upvotes: 1

abidibo
abidibo

Reputation: 4287

The problem here is that

reverse("accounts:signup")

returns an url, see here (https://docs.djangoproject.com/en/1.7/ref/urlresolvers/#reverse), while you need a template path, so you should return:

return render(request, 'accounts/signup.html', {'form': signup_form})

Upvotes: 5

Related Questions