当前位置: 首页 > 知识库问答 >
问题:

Django。重要性错误:尝试相对导入超出顶级包

宗政斌
2023-03-14

我是一个新手。我刚刚开始写一个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:试图在顶级包之外进行相对导入

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

共有1个答案

竺辉
2023-03-14
  1. 导入错误
from ..iRay_working_with_notes.views import list_notes

应该是

from iRay_working_with_notes.views import list_notes
redirect('name-of-my-view-pattern')

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

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

从技术上讲,您当然可以导入一个视图并直接从另一个模块调用它,因为它只是一个python函数-但这不是超文本传输协议重定向(并且不会将浏览器中的url更改为重定向页面),此外,这并不是django请求/响应架构的真正想法。

 类似资料:
  • 问题内容: 似乎这里已经有很多关于python 3中相对导入的问题,但是经过许多讨论之后,我仍然找不到我问题的答案。所以这是问题。 我有一个如下所示的包裹 我在中只有一行: 现在,我在的文件夹中package,然后运行 我收到消息 但是如果我在的父文件夹中package,则运行: 一切都好。 现在我的问题是: 当我位于的文件夹中时,根据我的理解,我在test_A子软件包中运行模块,原因是,该模块.

  • 这里似乎已经有很多关于Python3中的相对导入的问题,但是在研究了其中的许多问题之后,我仍然没有找到我的问题的答案。所以问题就在这里。 我有一个包裹如下所示 一切都很好. 现在我的问题是:当我在文件夹中,并且我将test_A子包中的模块作为运行时,根据我的理解,只上一级,仍然在文件夹中,为什么它给出的消息是。到底是什么原因导致了这个错误信息呢?

  • 问题内容: 这是我的文件夹结构: 在我有: 在时: 现在,当我发出: 我得到: 由于“多份原件打印”是在sys.path中,并正确地解决它为什么抱怨相对进口上述顶层包? 这是顶层包 ? 顺便说一句,这是我向旧项目中添加测试的尝试-在Python测试包布局中曾提出过要求,但作为Python单元测试去哪儿的副本被关闭了。对我当前的测试包布局的评论深表感谢! 那么下面的答案不适用于我的情况: 该 模块

  • 我正在使用python 3.7,遇到了一个相对导入错误“试图相对导入超出顶级包”,文件夹结构如下:

  • 问题内容: 我的项目存在以下问题,请帮帮我!这是我的包裹的结构: 这是foo1.py的实现: 当我运行foo1时,出现错误: ValueError:尝试了相对于顶级包的相对导入 。 我可以通过以下调整来解决它: 但是我想知道是否有一种方法可以不导入sys并在其中附加父目录。 我听说,例如,如果我有.py文件’/pkg/start.py’,它调用了我的foo1模块,那么两个点就可以了。但是,有什么方

  • 如何在Python中从低级目录导入类? 我一直在阅读如何将添加到文件夹中(或者这只是在Python2中吗?)或者如何使用,但是这些都不起作用。 通过下面的代码,我得到了:valueerror:尝试相对导入超出顶级包 文件2.py 谢谢你。