美文网首页
实现第一个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