Django.contrib.auth.models.User.profile.RelatedObjectDoesNotExist: User has no profile. Django 4.0.6
Подскажете. Не гузиться профиль пользователя
wiews.py
from django.shortcuts import render, redirect
from django.urls import reverse_lazy
from django.contrib.auth.views import LoginView, PasswordResetView, PasswordChangeView
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.views import View
from django.contrib.auth.decorators import login_required
from .forms import RegisterForm, LoginForm, UpdateUserForm, UpdateProfileForm
def home(request):
return render(request, 'accounts/home.html')
class RegisterView(View):
form_class = RegisterForm
initial = {'key': 'value'}
template_name = 'accounts/register.html'
def dispatch(self, request, *args, **kwargs):
# will redirect to the home page if a user tries to access the register page while logged in
if request.user.is_authenticated:
return redirect(to='/')
# else process dispatch as it otherwise normally would
return super(RegisterView, self).dispatch(request, *args, **kwargs)
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
messages.success(request, f'Account created for {username}')
return redirect(to='login')
return render(request, self.template_name, {'form': form})
# Class based view that extends from the built in login view to add a remember me functionality
class CustomLoginView(LoginView):
form_class = LoginForm
def form_valid(self, form):
remember_me = form.cleaned_data.get('remember_me')
if not remember_me:
# set session expiry to 0 seconds. So it will automatically close the session after the browser is closed.
self.request.session.set_expiry(0)
# Set session as modified to force data updates/cookie to be saved.
self.request.session.modified = True
# else browser session will be as long as the session cookie time "SESSION_COOKIE_AGE" defined in settings.py
return super(CustomLoginView, self).form_valid(form)
class ResetPasswordView(SuccessMessageMixin, PasswordResetView):
template_name = 'accounts/password_reset.html'
email_template_name = 'accounts/password_reset_email.html'
subject_template_name = 'accounts/password_reset_subject'
success_message = "We've emailed you instructions for setting your password, " \
"if an account exists with the email you entered. You should receive them shortly." \
" If you don't receive an email, " \
"please make sure you've entered the address you registered with, and check your spam folder."
success_url = reverse_lazy('users-home')
class ChangePasswordView(SuccessMessageMixin, PasswordChangeView):
template_name = 'accounts/change_password.html'
success_message = "Successfully Changed Your Password"
success_url = reverse_lazy('users-home')
@login_required
def profile(request):
if request.method == 'POST':
user_form = UpdateUserForm(request.POST, instance=request.user)
profile_form = UpdateProfileForm(request.POST, request.FILES, instance=request.user.profile)
if user_form.is_valid() and profile_form.is_valid():
user_form.save()
profile_form.save()
messages.success(request, 'Your profile is updated successfully')
return redirect(to='users-profile')
else:
user_form = UpdateUserForm(instance=request.user)
profile_form = UpdateProfileForm(instance=request.user.profile)
return render(request, 'accounts/profile.html', {'user_form': user_form, 'profile_form': profile_form})
signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.contrib.auth import views as auth_views
from accounts.views import CustomLoginView, ResetPasswordView, ChangePasswordView
from accounts.forms import LoginForm
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('accounts.urls')),
path('login/', CustomLoginView.as_view(redirect_authenticated_user=True, template_name='accounts/login.html',
authentication_form=LoginForm), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='accounts/logout.html'), name='logout'),
path('password-reset/', ResetPasswordView.as_view(), name='password_reset'),
path('password-reset-confirm/<uidb64>/<token>/',
auth_views.PasswordResetConfirmView.as_view(template_name='accounts/password_reset_confirm.html'),
name='password_reset_confirm'),
path('password-reset-complete/',
auth_views.PasswordResetCompleteView.as_view(template_name='accounts/password_reset_complete.html'),
name='password_reset_complete'),
path('password-change/', ChangePasswordView.as_view(), name='password_change'),
path('', include('main.urls')),
]
В Админке "Profile" создаётся но пользователя в нём нет