Django. ImportError: attempted relative import beyond top-level package
Django. ImportError: attempted relative import beyond top-level package
我是新手。我刚开始写一个 django 项目。它称为 iRayProject,由两个应用程序 iRay_user_authentication 和 iRay_working_with_notes 组成:
project structure here
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-pattern:
的视图名称
redirect('name-of-my-view-pattern')
因此,请为 list_notes 视图创建一个 url-pattern 条目,并将模式名称作为重定向的参数。
为什么?因为重定向告诉客户端的浏览器加载目标重定向页面,所以它需要一个 url(由 django 通过 url-pattern 生成),因为目标页面将从浏览器。
从技术上讲,您当然可以导入视图并直接从另一个模块调用它,因为它只是一个 python 函数 - 但这不是 http 重定向(并且不会更改 url在浏览器中重定向到页面)另外,这并不是 django request/response 架构的真正想法。
我是新手。我刚开始写一个 django 项目。它称为 iRayProject,由两个应用程序 iRay_user_authentication 和 iRay_working_with_notes 组成: project structure here
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-pattern: 的视图名称
redirect('name-of-my-view-pattern')
因此,请为 list_notes 视图创建一个 url-pattern 条目,并将模式名称作为重定向的参数。
为什么?因为重定向告诉客户端的浏览器加载目标重定向页面,所以它需要一个 url(由 django 通过 url-pattern 生成),因为目标页面将从浏览器。
从技术上讲,您当然可以导入视图并直接从另一个模块调用它,因为它只是一个 python 函数 - 但这不是 http 重定向(并且不会更改 url在浏览器中重定向到页面)另外,这并不是 django request/response 架构的真正想法。