理解上下文
从render()说起,意思就是渲染,主要接受三个参数,
- request 从URL传过来的
- x.html制定模板的名称
- context上下文
render(request,x.html,context)
如何理解上下文呢?来看一个例子
比如There is a ____
waiting in the sky.这句话
我们可以在空白地方填入不同的词,就会有不同的意思,我们可以把这个句子想象成一个网页,context
就是数据库要取的数据去跟要显示的部分(填空的部分)做一个映射.
准备
在firstapp
文件夹中新建templates
static
文件夹,然后将.html
文件放入templates
,将静态文件放入static
告诉Django去哪里找模板文件
在setting.py中修改'DIRS'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'template').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',
],
},
},
]
引入静态文件
头行加入静态文件的标签,如第二行{% load staticfiles %}
替换css文件的路径,采用动态加载方式href="{% static 'css/semantic.css' %}"
<!DOCTYPE html>
{% load staticfiles %}
<html>
<head>
<meta charset="utf-8">
<title>first web</title>
<link rel="stylesheet" href="{% static 'css/semantic.css' %}" media="screen" title="no title" charset="utf-8">
<link href="https://fonts.googleapis.com/css?family=Oswald|Raleway" rel="stylesheet">
还要一处需要修改
.ui.vertical.segment.masthead {
height: 300px;
background: url({% static 'images/star_banner.jpg' %});
background-size: cover;
background-position: 100% 80%;
}
Django后台
Django自带了一个后台,启动服务器后,可以在http://127.0.0.1:8000/admin/login/?next=/admin/
访问
此时由于我们没有创建超级用户,所以无法登陆
创建超级用户
用如下命令创建,邮箱可以直接回车不填
python .\manage.py createsuperuser
之后便能登陆,登陆后界面如下
我们可以刚刚添加的admin,但是没有我们在之前小实例中创建的用户,这是由于没有注册的原因,我们需要在
admin.py
文件中添加注册信息from django.contrib import admin
from firstapp.models import People
# Register your models here.
admin.site.register(People)
之后我们再次查看admin页面
在models里面设置内容列表的标题
为了让内容列表里能直接显示标题,需要到models.py
里面,增加一个直接显示名字的函数
class People(models.Model):
name = models.CharField(null= True,blank = True,max_length = 200)
job = models.CharField(null = True,blank = True,max_length = 200)
def __str__(self):
return self.name
这样在点击Peoples
后,新建一个用户,就能直接显示用户名了,而不是类名
model里增加文章数据字段
在models.py
里面定义文章的数据字段:
class Article(models.Model):
headline = models.CharField(null=True,blank=True,max_length=500)
content = models.TextField(null=True,blank=True)
def __str__(self):
return self.headline
在admin里增加文章管理(注册)
按照上面的方式,再来把文章这一项添加管理后台里面.
在admin.py
里面增加我们想要的数据
(1)引入 (2)添加注册
from django.contrib import admin
from firstapp.models import People,Article
# Register your models here.
admin.site.register(People)
admin.site.register(Article)
合并数据库
在终端输入一下两条命令
python manage.py makemigrations
python manage.py migrate
然后就可以去后台添加文章内容了(手动添加)
在View中获取Model中的数据
引用model里面写好的文章列表,然后去渲染文章列表
def index(request):
context = {}
article_list = Article.objects.all()
context['article_list'] = article_list
index_page = render(request,'first_web_2.html',context)
return index_page
在Template中增加动态内容
回到templates文件夹下的html文件中,增加必须的模板标签,让文章内容可以获取管理后台的内容:
<!DOCTYPE html>
{% load staticfiles %}
<html>
<head>
<meta charset="utf-8">
<title>first web</title>
<link rel="stylesheet" href="{% static 'css/semantic.css' %}" media="screen" title="no title" charset="utf-8">
<link href="https://fonts.googleapis.com/css?family=Oswald|Raleway" rel="stylesheet">
注意文章部分
{% for article in article_list %}
{{ article.headline }}
模板过滤:大于50个词不显示
{{ article.content|truncatewords:50 }}
{% endfor %}
<div class="ui vertical segment">
{% for article in article_list %}
<div class="ui container vertical segment">
<a href="#">
<h1 class="ui header">
{{ article.headline }}
</h1>
</a>
<i class="icon grey small unhide">10,000</i>
<p>
{{ article.content|truncatewords:100 }}
<a href="#">
<i class="angle tiny double grey right icon">READMORE</i>
</a>
</p>
<div class="ui mini tag label">
life
</div>
</div>
{% endfor %}
</div>
在URL中分配网址
修改urls.py文件(最后部分)
"""firstsite URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url
from django.contrib import admin
from firstapp.views import first_try,index
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^first_try/', first_try),
url(r'^index', index,name = 'index')
]
使用python manage.py runserver
命令运行,然后在浏览器中输入http://127.0.0.1:8000/index#
查看效果
注意红框部分,多余的未显示
用GET方法实现文章分类功能
首先在models.py
中添加tag
,注意新加入的参数choices
,TAG_CHOICE
是一个元组,然后tag可以从中选择.
class Article(models.Model):
headline = models.CharField(null=True,blank=True,max_length=500)
content = models.TextField(null=True,blank=True)
TAG_CHOICE = (
('tech','Tech'),
('life','Life')
)
tag = models.CharField(null = True,blank = True,max_length = 5,choices= TAG_CHOICE)
def __str__(self):
return self.headline
不要忘了执行
python manage.py makemigrations
python manage.py migrate
这时我们可以来到管理界面
,给文章加一个tag
之后我们来到views.py
中,修改index
函数如下:
request.GET.get('tag')
是获取用户通过 GET
方法传过来的参数,我们需要做一个判断,如果有参数,则对文章进行过滤,返回tag
指定的文章,
如果没有传参,则返回所有文章.
def index(request):
context = {}
queryset = request.GET.get('tag')
if queryset:
article_list = Article.objects.filter(tag = queryset)
else:
article_list = Article.objects.all()
context['article_list'] = article_list
index_page = render(request,'first_web_2.html',context)
return index_page
我们再来templates
中修改模板文件,实现点击下面红框中tag,然后跳转到指定的文章
打开.html
文件,找到<a>
标签,修改如下
<div class="menu">
<a class="item" href="?tag=life">life</a>
<a class="item" href="?tag=tech">tech</a>
</div>
然后修改一下文章末尾的标签logo文字
<div class="ui mini tag label">
{{ article.tag }}
</div>
网友评论