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: 尝试相对导入超出顶级包

而且我找到了很多关于为什么会出现这个错误的理论资料。 但我仍然无法弄清楚是否有简单的相对或绝对导入方法,或者我只是没有正确构建我的项目??

  1. 导入错误
from ..iRay_working_with_notes.views import list_notes

应该是

from iRay_working_with_notes.views import list_notes
  1. 重定向需要来自 urls-pattern:
  2. 的视图名称
redirect('name-of-my-view-pattern')

因此,请为 list_notes 视图创建一个 url-pattern 条目,并将模式名称作为重定向的参数。

为什么?因为重定向告诉客户端的浏览器加载目标重定向页面,所以它需要一个 url(由 django 通过 url-pattern 生成),因为目标页面将从浏览器。

从技术上讲,您当然可以导入视图并直接从另一个模块调用它,因为它只是一个 python 函数 - 但这不是 http 重定向(并且不会更改 url在浏览器中重定向到页面)另外,这并不是 django request/response 架构的真正想法。