Python Django创建web项目实例中遇到的问题以及解决方法

目录

前言

问题一: 'Specifying a namespace in include() without providing an app_name '

1. 出现背景:    

2. 原因:

3. 解决办法:

问题二: Page not found(404)

1. 出现背景:  

2. 原因:

3. 解决办法:

问题三: TemplateDoesNotExist at /XXX

1. 出现背景:

扫描二维码关注公众号,回复: 4608770 查看本文章

2. 原因: 

3. 解决办法:

问题四: Model class XXX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

1. 出现背景:

2. 原因: 

3. 解决办法:



 

前言

《Python编程从入门到实践》书中,第18章介绍了使用Django模块创建web项目的实践方法,但在实际操作过程中,发现因为版本更新等问题,会出现一些问题。经过搜寻解决问题、查看文档等方法,将这些问题成功修复,项目正常运行。在此做个记录,帮助其他同学快速改进

我使用的python版本3.6.3, Django版本2.1.2,并且没有创建虚拟环境venv

根据书中指导,在大项目中创建了自己的子项目app: learning_logs

python manage.py startapp learning_logs

在其中创建models、views、templates等操作,项目结构如下:

问题一: 'Specifying a namespace in include() without providing an app_name '

1. 出现背景:    

urls.py配置添加了到learning_logs的映射,将http://localhost:8000/映射转入learning_logs的子app,根据书中编写如下:

"""urls.py中配置"""
urlpatterns = [
    path('admin/', admin.site.urls),
    # 新添加的映射
    path(r'^$', include('learning_logs.urls', namespace='learning_logs')),
]

启动程序后,后台报错:

2. 原因:

在include方法里面指定namespace参数,却不提供app_name,是不允许的。 所以报错

3. 解决办法:

修改 urls.py的配置

"""urls.py中配置(修改后)"""
urlpatterns = [
    path('admin/', admin.site.urls),
    # 新添加的映射(修改后,将namespace的参数值用元组也传入include第一个参数中)
    path(r'^$', include(('learning_logs.urls','learning_logs'), namespace='learning_logs')),
]

可以看到将'learning_logs'也传入include()的第一个参数中,之后启动正常:

问题二: Page not found(404)  The current path, /XXX, didn't match any of these.

1. 出现背景:  

"""urls.py中配置(修改后)"""
urlpatterns = [
    # 新添加的映射(修改后,将namespace的参数值用元组也传入include第一个参数中)
    path(r'^$', include(('learning_logs.urls','learning_logs'), namespace='learning_logs')),
]

urls.py配置如上所示,启动服务器后,使用浏览器访问: http://localhost:8000/ 出现Page not found(404)页面,如下:

(我这里截图有详细信息是因为settings.py中开了DEBUG = True,如果不开可能没有详细信息,但通过看浏览器后台请求也可以发现错误码404)

2. 原因:

可以看到,服务器的两个uri映射,一个是admin,另一个是^$,正是我们在urls.py中的配置。但不同的是,我们原先的配置为r"^$",为正则表达式,是希望拦截一个空字符串,但系统没有生效。

根据查询,书中的这种正则表达式配置,在Django版本升级之后变的不能直接用了。解决方法有两种:

  • 不使用正则表达式,直接使用""进行匹配
  • 如果必须使用正则表达式,则需要用re_path() 替换 path()

3. 解决办法:

1) 不使用正则表达式, 修改urls.py 如下

urlpatterns = [
    # 新添加的映射,不用正则表达式
    path("", include(('learning_logs.urls','learning_logs'), namespace='learning_logs')),
]

2) 必须使用正则表达式的场景,则使用re_path() 替换 path(), 修改urls.py 如下

from django.urls import re_path
urlpatterns = [
    # 新添加的映射,使用正则表达式
    re_path('^$', include(('learning_logs.urls','learning_logs'), namespace='learning_logs')),
]

两种方法都能解决URL映射问题

 

 

问题三: TemplateDoesNotExist at /XXX

1. 出现背景:

当新创建learning_logs的子app后,将http://localhost:8000/ uri映射在learning_logs时,编写learning_logs/urls.py,映射在learning_logs/templates/index.html中,如下:

"""learning_logs/urls.py"""
urlpatterns = [
    path('', views.index, name='index'),
]

但在实际使用浏览器调用:http://localhost:8000/后,后台会报:TemplateDoesNotExist,如下

2. 原因: 

learning_logs/templates这个文件夹,并不在系统检索的模板文件夹内,所以没有检索到对应的index.html文件,报错

3. 解决办法:

需要在settings.py中添加配置,以使learning_logs/templates进入检索模板文件夹,共有两种方法:

1)  使learning_logs这个app在web项目中生效(app在web项目中生效后,其下面的templates文件夹自动会进入被检索的templates文件夹内):

在settings.py 的 INSTALLED_APPS配置中,添加一行:'learning_logs' , 如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.sites', # 新加一行
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 我的应用程序
    'learning_logs',
]

2) 直接将learning_logs/templates文件夹添加入模板检索文件夹内

在settings.py的TEMPLATES中的'DIRS'中添加:“learning_logs/templates”(旧Django版本中,是在TEMPLATES_DIRS中添加配置),如下:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 添加指定的模板文件夹地址
        'DIRS': [os.path.join(BASE_DIR, "learning_logs\\templates").replace('\\','/')], 
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

这两种都能生效

 

 

问题四: Model class XXX doesn't declare an explicit
 app_label and isn't in an application in INSTALLED_APPS.

1. 出现背景:

在子app:learning_logs的models中编写了数据库DAO映射类Topic,如下:

class Topic(models.Model):
    """用户学习的主题"""
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        """返回模型的字符串表示"""
        return self.text

当想要在自己的html中调用此Topic,拿到所有数据前端展示时:

{% extends "learning_logs/base.html" %}

{% block content %}
<p>Topics</p>
<ul>
    {% for topic in topics %}
    <li> {{ topic }}</li>
    {% empty %}
    <li>No topics have been added yet.</li>
    {% endfor %}
</ul>
{% endblock content %}

在启动项目时,就会报错。截图如下:

2. 原因: 

报错日志中,其实已有明确的解释,如本例,提示到learning_logs.models.Topic 类没有声明为一个显式的app_label,并且没有在INSTALLED_APPS中注册为一个application应用

3. 解决办法:

在settings.py中的INSTALLED_APPS中,注册 learning_logs,如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.sites', # 新加一行
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 我的应用程序
    'learning_logs',
]

再启动程序,可以看到正常运行,url调用正常

猜你喜欢

转载自blog.csdn.net/u010086122/article/details/82959785
今日推荐