使用Django搭建web应用程序(一)

Django的Web框架是可以用来开发交互式网站的工具,它能够响应网页请求,更轻松的读写数据库、管理用户等。

1. 在Django中创建项目:

django-admin  startproject 项目名 . 

  命令行最后的句点一定带上,否则部署应用程序时将遭遇一些配置问题。如果忘记使用句点,可以将创建的文件和文件夹删除重新运行

2. 创建数据库:

python manage.py migrate

  我们将修改数据库成为迁移数据库,后面如果对数据库中的模型进行修改后,也要执行迁移操作。

执行python manage.py runserver

此时就可以打开http://127.0.0.1:8000查看项目是否成功展示了页面

3. 创建应用程序:

python manage.py startapp 应用名

  该命令创建应用程序所需的基础设施 ,新增应用名同名的文件夹,其中包含models.pyadmin.pyviews.py 。

4. 定义模型:

打开models.py 在其中创建自己的模型

 1 from django.db import models
 2 
 3 # Create your models here.
 4 
 5 
 6 class Pizza(models.Model):
 7     """定义Pizza模型"""
 8     name = models.CharField(max_length=200)
 9     date_added = models.DateTimeField(auto_now_add=True)
10 
11     def __str__(self):
12         """返回模型的字符串表示"""
13         return self.name
14 
15 
16 class Topping(models.Model):
17     """定义Topping模型"""
18     pizza = models.ForeignKey(Pizza, on_delete=models.DO_NOTHING)
19     name = models.TextField()
20     date_added = models.DateTimeField(auto_now_add=True)
21 
22     def __str__(self):
23         """返回模型的字符串表示"""
24         return self.name

5. 激活模型:

要使用模型,必须让Django将应用程序包含到项目中。打开settings.py,在INSTALLED_APPS下添加自己的应用名。

  • 接下来要让Django修改数据库,使其能够存储模型相关的信息。

python manage.py makemigrations 应用名

命令makemigrations让Django去欸的那个该如何修改数据库,存储与我们新定义的模型相关联的数据。

输入表明Django创建了一个名为0001——initial.py的迁移文件,这个而文件在数据库中为模型创建一个表。

  • 然后用这个迁移进行修改(创建过的)数据库

python manage.py migrate
这个命令上面执行过,第一次执行为创建数据库,后面再执行的时候就是修改

6. 管理网站

  • 创建超级用户

python manage.py createsuperuser

  • 向管理网站注册模型

修改admin.py

1 from django.contrib import admin
2 
3 # Register your models here.
4 from pizzas.models import Pizza, Topping
5 
6 admin.site.register(Pizza)
7 admin.site.register(Topping)

此时访问http://127.0.0.1:8000/admin/时,就可以使用超级管理员,来进行数据修改了

过程中遇到的问题

1.

python manage.py makemigrations learning_logs

在models.py中创建了两个数据库表模型,第二个表引用第一个表的id作为外键,

topic = models.ForeignKey(Topic)

修改数据库模型时提示报错:

报错内容:

  File "C:Userschenhao.jialearning_logsmodels.py", line 14, in <module> class Entry(models.Model):

  File "C:Userschenhao.jialearning_logsmodels.py", line 16, in Entry topic = models.ForeignKey(Topic)

TypeError: __init__() missing 1 required positional argument: 'on_delete'

分析:

看报错提示是因为在topic = models.ForeignKey(Topic)中少了一个参数,

在这行关联语句中加入on_delete=models.DO_NOTHING

原因如下:

django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
TypeError: init() missing 1 required positional argument: ‘on_delete’

on_delete各个参数的含义如下:

on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET,         # 删除关联数据,

2.

增加完on_delete参数之后,再次修改模型时提示:

You are trying to add a non-nullable field 'topic' to entry without a default; we can't do that (the database needs something to populate existing rows).

Please select a fix:

 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

 2) Quit, and let me add a default in models.py

原因分析:

因为之前数据库中已经有数据了,现在加了一个字段,如果这个字段没有默认值,它不知道该填什么,所以会报错

因此只要先给他一个任意的默认值(数据类型要能对应上),然后python manage.py makemigrations XXX修改数据库,再python manage.py migrate迁移数据库。

再将default删去,再次修改数据库-迁移数据库就OK了。

——————待续——————

最懒的人就是整天忙得没时间学习、反思、成长的人。
原文地址:https://www.cnblogs.com/jockeyhao/p/14607974.html