0
votes

I am trying to make a profile page, which simply is a page with user details, such as firstname, lastname, email, etc. But I think there is something wrong with my view or my url.py or my setting, which gives me an error of TemplateDoesNotExist at /users/profile/ (users/profile.html). Other pages are working fine though.

Here is my traceback:

File "/Documents/morse_log/m_env/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request)

File "/Documents/morse_log/m_env/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request)

*File "/Documents/morse_log/m_env/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs)*

File "/Documents/morse_log/users/views.py", line 32, in profile return render(request, 'users/profile.html', args)

File "/Documents/morse_log/m_env/lib/python3.7/site-packages/django/shortcuts.py", line 19, in render content = loader.render_to_string(template_name, context, request, using=using)

File "/Documents/morse_log/m_env/lib/python3.7/site packages/django/template/loader.py", line 61, in render_to_string template = get_template(template_name, using=using)

File "/Documents/morse_log/m_env/lib/python3.7/site-packages/django/template/loader.py", line 19, in get_template raise TemplateDoesNotExist(template_name, chain=chain)

Exception Type: TemplateDoesNotExist at /users/profile/ Exception Value: users/profile.html

settings.py:

INSTALLED_APPS = [
    # My apps
    'morse_logs',
    'users',

    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

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

/users/urls.py:

from django.urls import path, include
from django.contrib.auth.models import User

from . import views


app_name = 'users'

urlpatterns = [
    # Include default auth urls.
    path('', include('django.contrib.auth.urls')),

    # Registration
    path(r'/register/', views.register, name='register'),
    path(r'/profile/', views.profile, name='profile'),

]

/users/profile.html:

{% block content %}
<title>Profile</title>
<div class="container">
    <p>
        {{user}}
        {{user.first_name}}
    </p>
</div>

{% endblock %}

users/views.py:

from django.shortcuts import render, redirect
from django.contrib.auth import login
from django.contrib.auth.forms import UserCreationForm
from users.forms import RegistrationForm
from django.contrib.auth import views as auth_views
from django.contrib.auth.models import User


# Create your views here.
def register(request):
    """Register a new user"""
    if request.method != 'POST':
        # Display blank registration form
        form = RegistrationForm()
    else:
        # Process completed form
        form = RegistrationForm(data=request.POST)

        if form.is_valid():
            new_user = form.save()
            # Log the user in and then redirect to home page
            login(request, new_user)
            return redirect('morse_logs:index')

    # Display a blank or invalid form.
    context = {'form': form}
    return render(request, 'registration/register.html', context)


def profile(request):
    args = {'user': request.user}
    return render(request, 'users/profile.html', args)

users/model.py: (in my text editor, it says 'sender' value is not used, Unresolved attributes reference 'objects' for class UserProfile)

from django.db import models
from django import forms
from django.contrib.auth.models import User
from django.db.models.signals import post_save

# Create your models here.


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    description = models.CharField(max_length=100, default='')


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

    post_save.connect(create_profile, sender=User)

forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm


class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = (
            'username',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        )

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user
1

1 Answers

1
votes

Need to add the template directory in the templates list:

'DIRS': [os.path.join(BASE_DIR, 'templates')]  

So replace the following TEMPLATES list.

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

And create template in the following format:

      users  
        ----|templates
               ----|users
                  -----|profile.html