Редирект в представлении не находит путь к url или шаблон html
Я пытаюсь перенаправить с одного представления на другое представление или имя url, но получаю ошибки независимо от того, какой тип перенаправления я использую. Я предпочитаю использовать имя представления, чтобы избежать жесткого кодирования url.
Соответствующие фрагменты просмотров:
основной фрагмент представления
if form.is_valid():
""" check if passwords match """
print('form is valid')
password1 = form.cleaned_data.get('password1')
password2 = form.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise messages.add_message(request, messages.error, "Passwords don't match")
return redirect('/members:new_profile')
""" create user, set hashed password, redirect to login page """
print('creating user')
user = form.save(commit=False)
user.set_password(password1)
user.save()
return redirect('members:user_login')
представление_логина пользователя
def UserLogin(request):
""" Member authenticate, set session variables and login """
if request.method == 'POST':
username = request.POST.get('email')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
""" set session expiry and variables with login"""
login(request, user)
request.session.set_expiry(86400)
watchlist_items = Watchlist.objects.filter(created_by_id=user.id, status=True).values_list('listing_id', flat=True)
print(f"watchlist_items: {watchlist_items}")
if watchlist_items:
request.session['watchlist'] = list(watchlist_items)
print(f"watchlist session variable: {request.session['watchlist']}")
messages.add_message(request, messages.success, 'You have successfully logged in')
else:
request.session['watchlist'] = []
messages.add_message(request, messages.success, 'You have successfully logged in')
return redirect('general/dashboard.html')
else:
""" user has old account, prompt to reactivate and pay new subscription """
messages.add_message(request, messages.error, 'This account is no longer active, please reactivate '
'account (subscription required)')
return redirect('members/member_login.html')
else:
messages.add_message(request, messages.error, 'Username or password is incorrect')
return redirect('members/member_login.html')
else:
return redirect('members/member_login.html')
members/urls.py
from django.urls import path
from members import views
app_name = 'members'
urlpatterns = [
path('new_profile/', views.NewUserCreate, name='new_profile'),
path('user_login/', views.UserLogin, name='user_login'),
path('user_logout/', views.UserLogout, name='user_logout'),
]
уровень проекта urls.py
urlpatterns = [
path('accounts/', include('django.contrib.auth.urls')),
path('', include('general.urls')),
path('members/', include('members.urls')),
path("__debug__/", include("debug_toolbar.urls")),
]
В коде главного представления я пробовал следующее с различными проблемами:
возвращает HttpResponseRedirect(reverse('members:user_login')))
- error page not found - пытается найти шаблон по адресу http://127.0.0.1:8000/members/user_login/members/member_login.html
return redirect('user_login') - ошибка NoReverseMatch at /members/new_profile/
return redirect('members:user_login') - ошибка Page not found, url указан как http://127.0.0.1:8000/members/user_login/members/member_login.html
return redirect('/members:user_login') - ошибка страницы не найдена, попытка url http://127.0.0.1:8000/members:user_login
Я знаю, что это должно быть просто сделать, и у меня есть редиректы, работающие для других видов, не могу найти лучшее решение здесь, любая помощь будет оценена по достоинству.
В вашем коде я обнаружил проблему в том, как вы написали редирект. Правильный синтаксис таков:
return redirect('app_name:url_name')
и также вы пытаетесь перенаправить на HTML-страницу в представлении user_login, что невозможно, вместо этого вы должны отобразить HTML-страницу следующим образом
return render(request, 'members/member_login.html')
Дополнительная информация
Я заметил, что вы написали имя представления в CamelCase, что неправильно, вместо этого вы должны писать в snake_case
Надеюсь, это было полезно для вас. Счастливого кодинга.