Django. ImportError: попытка относительного импорта за пределы пакета верхнего уровня
Я новичок. И я только что начал писать проект на django. Он называется iRayProject и состоит из двух приложений iRay_user_authentication и iRay_working_with_notes: структура проекта здесь
iRay_user_authentication - это стандартное приложение django для регистрации
Вот его urls.py
from django.urls import path
from .views import login_user, registration
urlpatterns = [
path('', login_user, name='login_user'),
path('registration', registration, name='registration'),
]
В views.py зарегистрированного пользователя с помощью редиректа я хочу отправить во второе приложение проекта
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.contrib.auth import login, logout, authenticate
from ..iRay_working_with_notes.views import list_notes
def login_user(request):
if request.method == 'GET':
return render(request, 'iRay_user_authentication/login.html', {'form': AuthenticationForm})
def registration(request):
if request.method == 'GET':
return render(request, 'iRay_user_authentication/registration.html', {'form': UserCreationForm})
else:
if '_guest' in request.POST:
pass
else:
if request.POST['password1'] == request.POST['password2']:
try:
user = User.objects.create_user(request.POST['username'], password=request.POST['password1'])
user.save()
login(request, user)
return redirect(list_notes)
except IntegrityError:
return render(request, 'iRay_user_authentication/registration.html', {'form': UserCreationForm,
'error': 'name is busy '
})
else:
return render(request, 'todo_app/registration.html', {'form': UserCreationForm,
'error': 'passwords not math'})
Но при попытке импортировать функцию из второго views.py
from django.shortcuts import render
def list_notes(request):
return render(request, 'iRay_working_with_notes/list_notes.html')
Я получаю ошибку:
ImportError: попытка относительного импорта за пределы пакета верхнего уровня
И я нашел много теоретической информации о том, почему возникает эта ошибка. Но я так и не смог понять, существует ли простой способ относительного или абсолютного импорта, или я просто неправильно структурировал свой проект?
- импорт неправильный
from ..iRay_working_with_notes.views import list_notes
должно быть
from iRay_working_with_notes.views import list_notes
- перенаправить нужно имя представления из urls-шаблона:
redirect('name-of-my-view-pattern')
Пожалуйста, создайте запись url-паттерна для представления list_notes и передайте имя паттерна в качестве параметра для редиректа.
Почему? Потому что редирект указывает браузеру на стороне клиента загрузить целевую страницу редиректа, поэтому ему нужен url (который генерируется django через url-pattern), поскольку целевая страница будет вызываться из браузера.
Технически, конечно, вы можете импортировать представление и вызывать его из другого модуля напрямую, поскольку это просто функция python - но это не http редирект (и не изменит url в браузере на перенаправленную страницу) и, кроме того, это не совсем соответствует идее архитектуры запроса/ответа django.