Django2.2基本应用结构以及基本模板
Posted zkzgogogo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django2.2基本应用结构以及基本模板相关的知识,希望对你有一定的参考价值。
第三节:Django基本应用结构
主要解决问题就是为了使用同一个模板处理不同任务,像显示文章的位置其实就标题和内容不一样其他大概都是一样的,因此对于这种基本上相同的任务,我们可以创建一
功能app,对于这种功能设计模板,方便管理、应用
1. 在项目中创建Django app
进入manage.py文件所在你目录,执行命令:python manage.py startapp <app名称>
成功就可以看到多出了一个<app名称>文件夹
结构图
<app名称>文件夹
<migration>文件夹
__init__.py
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
注意这个是原始结构图,后面会根据需要增加例如urls.py、templates等文件,或者是由于一些自动的命令配置变化的文件
2. model模型
设计app模板,个人理解像是设置这个app的数据样式
model.py内容:
from django.db import models
# Create your models here.
class Article(models.Model):
# 下面两个使用的都是Django里面的字段类型
title = models.CharField(max_length=30) # 标题字段,设置字段长度限制
content = models.TextField() # 文本字段
其中按照需要设置了标题、文字内容两个格式
在后面步骤弄完后,进入超级管理员界面增加article数据是页面显示的就是这个两个需要增加的空
3. 同步到数据库
需要在Django项目设置文件(./<项目文件名>/settings.py)里面设置使用这个app文件
文件内容:
# Application definition
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘article‘, # 加入创建的app名
]
迁移命令:
py manage.py makemigrations -> 制造迁移
py manage.py migrate -> 迁移
执行成功后就可以看到迁移文件生成并将模板和数据库联系
生成的文件为<app名>文件夹 --> <migrations>文件夹 --> 0001_initial.py
点击进入可以看到如下内容:
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name=‘Article‘,
fields=[
(‘id‘, models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name=‘ID‘)),
# AutoField自动增加字段 primary_key主键
(‘title‘, models.CharField(max_length=30)), # 增加的title字段
(‘content‘, models.TextField()), # 增加的文本内容字段
],
),
]
可以看到生成对应的格式也是按照模板文件来的
4. 在<app名>文件夹中的admin中注册应用!!!
admin内容如下:
from django.contrib import admin
from .models import Article
# Register your models here.
admin.site.register(Article) # 注册app应用
登录超级管理员界面后就可以看见新注册的栏(article这里示例的app名称)
点击进入app
进入app页面后可以add数据
第四节课: 用模板显示内容
模型的objects获取、操作模型的对象
<注册的app名这里是Article>.object.get(条件)
<注册的app名这里是Article>.object.all()
<注册的app名这里是Article>.object.filter(条件)
创建、使用模板
前端页面和后端代码分离,减低耦合性
1. 在<app名>文件夹下创建<tenplates>文件夹
2. 在<tenplates>文件夹中创建html文件
3. 在<app名>文件夹中的views.py将原先耦合的代码改为分离
views.py文件中对应的显示文章页面的视图函数内容如下:
from django.shortcuts import render, render_to_response, get_object_or_404
from django.http import HttpResponse, Http404
from .models import Article
# Create your views here.
def article_detail(request, article_id):
# try:
# article = Article.objects.get(id=article_id)
# context={}
# context["article_obj"] = article
# # return render(request, "article_detail.html", context)
# return render_to_response("article_detail.html", context) # 5. render_to_response更简便
# except Exception as e:
# raise Http404(e)
# 将Article.objects.get改成使用get_object_or_404来获取object,可以使得代码更简洁
article = get_object_or_404(Article, pk=article_id)
context = {}
context["article_obj"] = article
return render_to_response("article_detail.html", context) # render_to_response更简便
# return render(request, "article_detail.html", context) # 4. 使用模板渲染内容
# return HttpResponse("文章 id: %s" % article_id) # 1. 简单的返回get请求参数
# 2. 下面利用objects获取数据内容
# return HttpResponse("文章 id: %s, 文章标题:%s, 文章内容:%s" % (article_id, article.title, article.content))
# 3. 下面添加html5样式
# return HttpResponse("<h2>文章 id: %s</h2> <br>文章标题:%s<br>文章内容:%s" % (article_id, article.title, article.content))
对应的模板HTML文件为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>{{article_obj.title}}</h2>
<hr>
<p>{{article_obj.content}}</p>
</body>
</html>
可以看到这边用的数据就是views.py 文件中传过来的字典的key(article_obj)
4. 在<项目文件名> --> <项目文件名> --> urls.py文件中加入对应的路径
这个就补贴示例代码,基本和之前加入路径的方式一样,后面有改进方案
这个不好的地方是一旦项目大起来后,这边总的urls.py 文件非常的混乱,不利于管理在最后一个知识点会讲到怎么弄
文章列表
这个也是在<app名>文件夹下views.py 文件中编写对应的视图函数,同时在templates文件夹中增加对应的HTML文件
视图函数:
def article_list(request):
article = Article.objects.all() # 获取所有文章数据
context = {}
context["articles"] = article
return render_to_response("article_list.html", context) # 传入HTML中
HTML文件,记录了一些改进以及改进前的代码使用#注释掉 方便后面回忆
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for article in articles %}
<!--<p>{{article.title}}</p>--> <!--1. 普通的将所有文章的标题罗列-->
<!--<a href="/article/{{article.pk}}">{{article.title}}</a>--> <!--将所有文章的标题罗列,并且这些文章标题都可以连接到文章对应的网页-->
<a href="{% url ‘article_detail‘ article.pk %}">{{article.title}}</a><!--改进:使用在urls文件中定义的name标签跳转-->
{% endfor %}
<!--{{ articles }}--> <!-- 换成上面那种,将文章的标题循环列出-->
</body>
</html>
总urls包含app的urls
总urls.py 文件
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path(‘admin/‘, admin.site.urls),
path(‘‘, views.index), # 加入路径
path(‘article/‘, include("article.urls")) # 加入子app下的urls.py,且因为article已经注册过时app了,所以不需要导入
]
子app下的urls.py 文件, 笔记在代码中
from django.urls import path
from .views import article_detail, article_list
urlpatterns = [
# name参数的作用: 是标记这个功能对应的path,在使用模板将所有文章罗列时,并且可以跳转到对应页面,这个时候可以使用name,这样子后面函数名改了
# 也不会需要那么大改动,像html模板里面基本用的是视图函数传进去的key
path(‘<int:article_id>‘, article_detail, name="article_detail"), # 加入app视图文件中article_detail视图函数
path(‘‘, article_list, name="article_list") # 加入app视图文件中article_list视图函数
]
hh这两节课的内容有点多,终于整理一遍了
总结这节课就是将子app的所有东西包括路由设置、模板、视图函数迁移到自己的文件下,方便管理
以上是关于Django2.2基本应用结构以及基本模板的主要内容,如果未能解决你的问题,请参考以下文章