目录
1.Django官网:The web framework for perfectionists with deadlines | Django
4.退出服务器运行状态,接下来我们创建一个名为polls的app,就在含有manage.py的mysite目录下,(注:polls为创建的app名字。可自己定义)
5.现在让我们打开mysite\polls目录,注意是目录,不要继续关注cmd窗口了。
6.创建一个名为migrate的数据表,同样还是在mysite目录下,其中migrate是自定义的数据表名称。
9.添加__str__()方法。(注:这里都是双下划线,Python内置方法都应为双下划线。)
12.介绍Django管理页面(或称为超级用户、网页后台账号、开发者)
目录呈上,全文一共32042个字,请慢慢享用。
1.Django官网:The web framework for perfectionists with deadlines | Django
教程来自此官网的DOCUMENT部分。
2.django的安装
一、未安装
win键+r | cmd | enter--------->调出命令行窗口
①在命令行窗口输入 pip install django 命令 进行安装;
②如果网不太好,可以考虑镜像源方式安装,cmd窗口输入以下命令(其中最后的为镜像源网址,可用其他镜像源网址代替):
pip install django -i https://pypi.douban.com/simple
③使用PyCharm或者Anaconde安装,这里不再赘述。
二、已安装django,但是版本太低。
因为此教程支持的是django4.0版本及后续版本,所以低版本可能不兼容。
可以在cmd中输入pip uninstall django,卸载后重新安装最新的django第三方库。
三、安装完成,开始检查版本。
①cmd中输入pip list 查看已安装的所有库的版本信息。
②cmd中输入py -m django --version 查看django的版本信息。(注:version前有两个横杠,且cmd命令语句中py等同于python,即此命令亦可作:python -m django --version)
出现错误:
No Django settings specified.
Unknown command: '--'
Type 'python -m django help' for usage.
原因:两个横杠之间与单词“version”之间存在空格就会报错。
③其他方式,比如在PyCharm中也可以查看版本信息,不赘述。
3.Creating a project|创建一个项目
cmd中输入cd + 路径,能切换到指定的目录当中(注:切换根目录如C盘D盘,输入盘名+冒号才能切换,如"c:")
接着输入:
django-admin startproject mysite
django会在cmd窗口当前工作目录当中创建名为mysite的一个文件夹,里边包含好了一些配置文件。其中mysite是自己的项目名称,可以自己定义。
官网中给出的如下图,表示的是mysite文件夹的目录树。
出现报错:
decode invalid start code
这是因为自己的电脑名称当中含有中文字符,可以从自己的电脑
设置 | 系统 | 关于 | 重命名这台电脑 ,然后重新设置设备名字,记住设置完成一定要重启电脑才可以生效。
cd到创建的mysite目录当中,我们在cmd窗口中输入py manage.py runserver(注:此命令为打开服务器运行状态,后边经常会用上。)
出现报错:
\...\Local\Programs\Python\Python38\python.exe: can't open file 'manage.py': [Errno 2] No such file or directory
原因:当前目录不包含manage.py文件,因此我们应该先cd 到之前我们创建的mysite文件夹下,然后运行上面的命令
出现以上的界面,说明我们可以访问给出的http://127.0.0.1:8000来检查服务器是否成功运行了。
访问后得到如上界面表示成功运行。
(注:此点并不那么重要。
修改最后的端口号,我们可以通过启动服务器的状态命令后边加上自己选定的端口号来实现,如:py managee.py runserver 8080,那么我们便需要访问http://127.0.0.1:8080,并且这种方法需要每次启动时都手动输入后边自己选定的端口号。)
退出服务器的运行状态:Ctrl+C
4.退出服务器运行状态,接下来我们创建一个名为polls的app,就在含有manage.py的mysite目录下,(注:polls为创建的app名字。可自己定义)
cmd输入:py manage.py startapp polls(请确保你退出了服务器运行状态,它除了Ctrl+C或者整个窗口关闭才能退出【关闭窗口就得重新回到mysite目录!!!】,否则会一直停留在不能输入的状态。)
polls的文件级目录如下:
5.现在让我们打开mysite\polls目录,注意是目录,不要继续关注cmd窗口了。
我们可以使用快捷键: win键+e打开文件夹,找到自己创建了mysite\polls的目录下,我们需要找到views.py的文件,那么以后我将描述为:polls/views.py(这也是官方文档的写法)
我们打开polls/views.py,在里边写下如下代码:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
在polls目录下并没有urls.py,所以我们需要创建一个urls.py文件,接着在polls/urls.py文件中写入如下代码:
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
接下来,我们在mysite/urls.py文件下写入一些代码:
(给代码前我希望你已经发现了一个小小的bug或者说避免bug发生的地方,那就是这里mysite文件夹不是polls文件夹的父目录,这里是mysite目录下还有一个名字一样为mysite的文件夹,与polls在一个平级目录,但是他们都拥有urls.py的文件,所以这两个urls.py文件是不同的文件,只是他们名字相同,在以后写代码的时候也得注意!!!)
mysite/mysite/urls.py,再次强调:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
在cmd窗口中输入py manage.py runserver,开启服务器,然后查看。wait
有人在这里出现了报错:
File "C:\Users\sldn\Desktop\mysite\mysite\urls.py", line 20, in <module>
path('polls/', include('polls.urls')),
NameError: name 'include' is not defined
include未被定义,这只是简单的bug,他其实会出现完全是因为粗心地忘了在导入模块没有导入include
让我们来分析一下这个粗心怎么产生的:
你打开了mysite/urls.py,看见他与要你输入的代码有重合之处,忘了仔细比较,在导入语句第二行还有include你没有添加进去,因此导致了这个错误。这在之后也是个值得注意的一点。
接着我们在浏览器输入http://127.0.0.1:8000/polls,注意后边有polls加上去了!!!,很容易在这里犯错,以至于官方文档标了出来:
出现以下界面,说明一切成功运行。
6.创建一个名为migrate的数据表,同样还是在mysite目录下,其中migrate是自定义的数据表名称。
cmd中输入:py manage.py migrate,以下为成功界面:
7.创建模型
在polls/models.py文件中写入如下代码,创建一个Question(问题)和Choice (选项)模型:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
polls应用进行安装到我们的项目里:
在mysite/settings.py写入polls.apps.PollsConfig配置,写入后,应当呈现如下代码:
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
settings.py本身配置文件挺长的,但是我们目前只关注INSTALLED_APPS部分,且只插入了一行代码。
接着继续配置我们的polls应用到程序当中,我们呢还需要在cmd窗口输入:
py manage.py makemigrations polls
得到如下输出:
查看一下SQL数据库对应信息:cmd中输入 py manage.py sqlmigrate polls 0001
输出结果如下:
再次运行migrate命令,在数据库里创建新定义的模型数据表:py manage.py migrate,输出结果如下:
8.数据库API接口,调试
在cmd窗口中 输入py manage.py shell进入数据库API,(注:以下代码在cmd窗口中只能一行一行地输入。)
进入API交互接口:
调试代码如下,之一只能一行一行地输入:
from polls.models import Choice,Question
Qustion.objects.all()
from django.utils import timezone
q = Question(question_text="What's new?",pub_date=timezone.now())
q.save()
q.id
q.question_text
q.pub_date
q.question_text = "What's up?"
q.save()
Question.objects.all()
调试的结果如下:
最后我们在API(shell)中输入exit命令退出。
9.添加__str__()方法。(注:这里都是双下划线,Python内置方法都应为双下划线。)
我们往polls里每一个模型都添加__str__()方法,为的是我们日后方便查看一个类的说明。
具体做法是在polls/models.py文件里添上关于__str__()方法的代码,完成后models.py所有代码如下:
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
10.往模型里添加一个实现“最近发布声明”的方法
为此,我们需要在polls/models/py文件里添加如下代码(注:以下为新添加进去的代码):
import datetime
from django.utils import timezone
class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
11.再次进入调试
cmd中输入python manage.py shell进入Python交互式命令行
调试代码如下(下面代码含注释,注释可以不用输入,其他只能一行一行输入):
>>> from polls.models import Choice, Question
# Make sure our __str__() addition worked.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
# Django provides a rich database lookup API that's entirely driven by
# keyword arguments.
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>
# Get the question that was published this year.
>>> from django.utils import timezone
>>>