-
一个最新版本的django教程
-
记录我花了很长时间搜索的解决方法以供未来使用
以搭建一个博客网站为实例
从头开始的django案例
: 你好! 如果你正在学习django并且想要从头开始学习一个完整的案例请从此处看起;
如果你需要某些常见的功能实现方法,也可以点击目录上的链接直接跳转到相应的知识点。
环境
mac/windows
python 3.x
django 3.1
由于开发系统的不同(也有人选择使用anaconda之类的集成环境),因此安装过程在此不再赘述,如果在安装环境的过程中出现任何报错,请自行搜索解决问题。(/dog)
以下演示项目均使用pycharm/ternimal 进行。
开始一个项目
django-admin startproject myproject

项目目录:
后文将提到的文件有
- myproject
- settings.py
- urls.py
- manage.py
其中
settings.py需要在其中配置网页中的访问ip、静态网页文件的存储路径、app名;
urls.py需要映射到app的urls文件;
manage.py执行数据库相关命令与项目启动命令。
在此处如果一切顺利的话,使用命令
python managy.py runserver 0.0.0.0:端口号
并且在浏览器中访问localhost:端口号 应该可以看到如下页面

使用命令
python manage.py migrate
来为项目创建一个(默认的)数据库sqlite3。如果你需要使用mysql数据库来连接django,请先使用settings.py对进行设置。
如果成功应该会显示如下图所示,并且在目录中会出现一个新的文件db.sqlite3 。

使用
python manage.py startapp blog
来创建一个我们今天的示例项目(blog)
以上,我们的项目目录变为了

Django 本身基于 MVC 模型,即 Model(模型)+ View(视图)+ Controller(控制器)设计模式。
MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:
- M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
- T 表示模板 (Template):负责如何把页面(html)展示给用户。
- V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。
现在M、V都有了,还差一个Ttemplates和一个属于app的urlsurls.py,这个urls虽然名字与项目下的文件一样,但是是放在appblog文件夹下的,一共有两个urls不要弄错。
手动创建一个名为templates的文件夹,与一个urls.py文件存放在blog文件夹下,填充的内容下文会说到。最终目录如下图。

由于本文偏重于对django框架的搭建应用,因此暂时不涉及static。
进入`settings.py`进行修改,共有三处地方需要修改(如果您需要使用其他数据库,或者使用外联的static文件,则需要更多修改)
```
...
#1、增加了允许访问的ip
ALLOWED_HOSTS = ['*']
...
```
```
...
#2、在此处增加创建的app名
INSTALLED_APPS = [
...
'blog',
]
...
```
```
...
#3、为刚才创建的T配置路径
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
]
...
```
将project目录下的urls.py指向app目录下的urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path(r'',include('blog.urls')),
#拼接app的urls地址到project的
]
from django.conf import settings
from . import views
from django.conf.urls import url
urlpatterns = [
]
#目前我们还没有编写视图
这样我们基础的django项目就编写好了。
编写博客案例
你好,你可能从一开始看到了现在,也有可能直接跳转到这里为了一些目的,总而言之我想再开始之前再贴一下当前的文件目录以确保我们的进度相同。

models编写
将应用的模型写入models.py
作为演示我们创建三个模型:用户、文章、评论
用户模型将实现网站登录注册的实现,并带大家了解一下django自带的用户模块django.contrib.auth.models.User的账号密码认证功能。
from django.contrib.auth.models import User
#只需要包含这个包即可,不需要编写模块类
文章模型实现外键关联、上传图片。
class Article(models.Model):
title = models.CharField(max_length=32,unique=True)
content = models.TextField()
author = models.ForeignKey(User,on_delete=models.CASCADE)
create_time = models.DateTimeField(auto_now_add=True)
edit_time = models.DateTimeField(auto_now=True)
image = models.ImageField(upload_to='templates/img/images')
def __str__(self):
return self.title
评论模型实现外键关联、ajax异步上传。
class Comment(models.Model):
Article = models.ForeignKey(Article,on_delete=models.CASCADE)
name = models.CharField(max_length=80)
body = models.TextField()
create_timestamp = models.DateTimeField(auto_now_add=True)
为了尽量节约大家的时间,我下面将分模块完成每个功能的实现。
forms表单提交(需要看)
在写完你的模型之后,我强烈建议你使用django官方推荐的forms表单,这将大大减少你接下来的工作量,他为您获取请求、捕获错误(error)、前端编写都带来了非常大的帮助。本文也会在接下来的步骤中重复使用它,因此您需要看完接下来的过程。
也许您在此之前都没有接触过表单,但无需担心,看完本文之后你可以非常熟练的使用它,相信你以后每一个django都会使用它 。
首先,在app目录下创建一个名为forms.py的文件
from django.forms import ModelForm
from .models import Article,Comment
from django.contrib.auth.models import User
from django.core.exceptions import NON_FIELD_ERRORS
class User_Form(ModelForm):
class Meta:
model = User
fields = '__all__'
error_messages = {
NON_FIELD_ERRORS: {
'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
}
}
class Article_Form(ModelForm):
class Meta:
model = Article
fields = '__all__'
error_messages = {
NON_FIELD_ERRORS: {
'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
}
}
class Comment_Form(ModelForm):
class Meta:
model = Comment
fields = '__all__'
error_messages = {
NON_FIELD_ERRORS: {
'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
}
}
可以看出其实格式非常简单,使用ModelForm您可以非常轻松的将models转换成forms。
首页
url.py
...
urlpatterns = [
url(r'^$', views.index_view),
]
views.py result 以后统一用于存放返回到T的变量。
from django.shortcuts import render
from .models import Article,Comment
# Create your views here.
def index_view(request):
result={}
articles = Article.objects.all().order_by('-create_time')
#(按创建时间)获取所有文章
result={
'articles':articles
}
render(request,'index.html',result)
在templates中创建文件index.html,通过模板遍历输出每一篇article
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Blog</title>
</head>
<body>
{% for article in articles %}
<a>{{article.title}}</a>
<a>{{ article.author }}</a>
<a>{{ article.create_time }}</a>
{% endfor %}
</body>
</html>
再次运行一下我们的项目,发现居然报错

好吧,数据库中还没有文章…
将Article和Coment在admin.py中注册一下
from django.contrib import admin
from .models import Article,Comment
# Register your models here.
admin.site.register(Article)
admin.site.register(Comment)
然后键入
python manage.py createsuperuser
为你的管理系统生成一个管理员账号。
访问localhost:端口号/admin
输入你刚才注册的账号,出现以下界面

点击Article 右边的Add按钮来添加任意数量的Article
本教程详细介绍了如何从零开始使用Django构建一个博客网站。内容涵盖环境配置、项目初始化、模型创建、表单处理及首页展示。通过实例操作,讲解了Django的MTV模式以及数据库操作,助你快速掌握Django开发。

338

被折叠的 条评论
为什么被折叠?



