美文网首页
实现第一个Django网站

实现第一个Django网站

作者: Co_zy | 来源:发表于2017-11-05 14:11 被阅读0次

理解上下文

从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>

相关文章

网友评论

      本文标题:实现第一个Django网站

      本文链接:https://www.haomeiwen.com/subject/anrxmxtx.html