zoukankan      html  css  js  c++  java
  • 【python3】第18章Django入门

    A、建立项目

    一、建立虚拟环境

    在项目的目录下创建一个虚拟环境

    python -m venv ll_env

    二、激活虚拟环境

    source ll_env/bin/active

    三、安装Django

    pip install django

    注意:django(虚拟环境安装的django)仅在虚拟环境处于活动状态时才可以使用

    四、在Django中安装项目

    django-admin.py startproject learning_logs

    五、创建数据库

    python manage.py migrate

    六、查看项目

    python manage.py runserver

    B、创建应用程序

    七、创建应用程序

    python manage.py startapp learning_logs

    八、定义模型

    CharField-由字符和文本组成的数据

    DateTimeField-记录日期和时间的数据

    其他字段类型参考https://docs.djangoproject.com/en/1.8/ref/models/fields/

    models.py
    from django.db import models
     
    # Create your models here.
     
     
    class Topic(models.Model):
        """用户学习的主题"""
        text = models.CharField(max_length=200)
        date_added = models.DateTimeField(auto_now_add=True)
     
        def __str__(self):
            """返回模型的字符串表示"""
            return self.text

    Django调用方法__str__()来显示模型的简单表示。在这里,我们编写__str__(),它返回存储在属性text中的字符串。

    九、激活模型

    settings.py
    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
     
        # My apps
        'learning_logs',
    )
    python manage.py makemigrations learning_logs

    命令makemigrations让Django确定该如何修改数据库,使其能够存储与我们定义的新模型相关联的数据。输出表明Django创建一个名为0001_initial.py的迁移文件,这个文件将在数据库中为模型Topic创建一个表。

    python manage.py migrate

    这个命令的大部分输出都与我们首次执行命令migrate的输出相同。我们需要检查的是图中最后一行的输出行。在这里,Django确认learning_logs应用迁移时一切正常。

    注意:每当修改项目的数据时,都采取一下三个步骤:

    1、修改models.py

    2、对文件(这里是learning_logs)调用makemigrations

    3、让Django迁移项目

    C、Django管理网站

    十、创建超级用户

    python manage.py createsuperuser

    Django并不会存储输入的密码,而存储从该密码派生出来的一个字符串——散列值。每当输入密码时,Django都计算其散列值,并将结果与存储的散列值进行计较。通过存储散列值,即便黑客获得了网站数据库的访问权,也只能获取其中存储的散列值,而无法获得密码。在网站配置正确的情况下,几乎无法根据散列值推导出原始密码。

    十一、向管理网站注册模型

    admin.py
    from django.contrib import admin
    from learning_logs.models import Topic
     
    # Register your models here.
     
    admin.site.register(Topic)  # 让Django通过管理网站管理我们的模型

    访问runserver地址(可以指定端口),输入刚刚创建的超级用户的用户名和密码。


    十二、添加主题

    点击“add”

    进入添加新主题的表单,输入“chess”,单击“Save”

    查看添加的topic

    D、定义模型Entry

    十三、创建模Entry

    第一个属性topic是一个ForeignKey实例。外键是一个数据库术语,它引用了数据库中的另一条记录;这些代码将每个条目关联到特定的主题。每个主题创建时,都给他分配一个键(或ID)

    。需要在俩项数据之间建立联系时,Django使用与每项信息相关联的键。

    models.py
    class Entry(models.Model):
        """学到的有关某个主题的具体知识"""
        topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
        text = models.TextField()
        date_added = models.DateTimeField(auto_now_add=True)
     
        class Meta:
            # Meta存储用于管理模型的额外信息,在这里,它让我们能够设置一个特殊属性,让Django在需要时使用entries来表示多个条目
            verbose_name_plural = 'entries'
     
        def __str__(self):
            """返回模型中的字符串表示"""
            return self.text[:50]+'...'  # 只显示前50个字符

    十四、迁移模Entry

    python manage.py makemigrations learning_logs
    python manage.py migrate


    十五、向管理网站注册Entry

    admin.py
    from django.contrib import admin
    from learning_logs.models import Topic, Entry
     
    # Register your models here.
     
    admin.site.register(Topic)
    admin.site.register(Entry)

    十六、添加一个条目

    点击Entry的“add”

    选择主题创建条目

    保存信息

    E、Django Shell

    十七、交互式shell会话

    python manage.py shell

    注意:每次修改模型后,都需要重启shell,这样才能看到修改的效果。要退出shell会话,可按Ctr+D;如果是windows系统,应按Ctr+Z,再按回车。

    F、创建网页:学习笔记主页

    十八、映射URL

    在learning_log文件夹下的urls.py中添加一行代码来包含模块learning_logs.urls。这行代码包含实参namespace,让我们能够将learning_logs的URL同项目中的其他URL区分开来。

    urls.py
    from django.contrib import admin
    from django.urls import path
    from django.conf.urls import include, url
     
    urlpatterns = [
        path('admin/', admin.site.urls),
        url(r'', include(('learning_logs.urls', 'learning_logs'), namespace='learning_logs')),
    ]

    在learning_logs中创建一个urls.py

    urls.py
    """定义learning_logs的URL模式"""
     
    from django.conf.urls import url
    from import views
     
     
    urlpatterns = [
        # 主页
        url(r'^$', views.index, name='index'),
    ]

    十九、编写视图

    views.py
    from django.shortcuts import render
     
    # Create your views here.
     
     
    def index(request):
        """学习笔记的主页"""
        return render(request, 'learning_logs/index.html')

    二十、编写模版

    在leaning_logs中创建一个文件夹templates,在里面创建一个learning_logs文件夹,新建一个文件,并将其命名为index.html

    index.html
    <p>Learning Logs</p>
    <p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>

    G、创建其他网页

    二十一、模版继承-父模版

    base.html
    <p>
        <a href="{% url 'learning_logs:index' %}">Learning Log</a>
    </p>
     
    {% block content %}{% endblock content %}

    二十一、模版继承-子模版

    重新编写index.html

    index.html
    {% extends "learning_logs/base.html" %}
     
    {% block content %}
        <p>Learning Log helps you keep track of your learning, for any topic you're learning about.</p>
    {% endblock %}

    二十一、显示所有主题的页面

    修改learning_logs/urls.py文件

    urls.py
    """定义learning_logs的URL模式"""
     
    from django.conf.urls import url
    from import views
     
     
    urlpatterns = [
        # 主页
        url(r'^$', views.index, name='index'),
         
        # 显示所有的主题
        url(r'^topics/$', views.topics, name='topics')
    ]

    在views.py中添加代码

    views.py
    from django.shortcuts import render
    from .models import Topic
     
    # Create your views here.
     
     
    def index(request):
        """学习笔记的主页"""
        return render(request, 'learning_logs/index.html')
     
     
    def topics(request):
        """显示所有的主题"""
        topics = Topic.objects.order_by('date_added')
        context = {'topics': topics}
        return render(request, 'learning_logs/topics.html', context)

    创建显示所有主题的页面的模版

    topics.html
    {% extends "learning_logs/base.html" %}
     
    {% block content %}
        <p>Topics</p>
        <ul>
        {% for topic in topics %}
            <li>{{ topic }}</li>
        {% empty %}
            <li>No topics have been added yet.</li>
        {% endfor %}
        </ul>
    {% endblock content %}

    修改父模版,使其包含到显示所有主题的页面的链接

    base.html
    <p>
        <a href="{% url 'learning_logs:index' %}">Learning Log</a>
    </p>
     
    {% block content %}{% endblock content %}

    H、显示特定主题的页面

    二十二、URL模式

    创建一个专注于特定主题的页面——显示该主题的名称及该主题的所有条目。修改learning_logs/urls.py文件

    urls.py
    """定义learning_logs的URL模式"""
     
    from django.conf.urls import url
    from import views
     
     
    urlpatterns = [
        # 主页
        url(r'^$', views.index, name='index'),
     
        # 显示所有的主题
        url(r'^topics/$', views.topics, name='topics'),
     
        # 特定主题的详细页面
        url(r'^topics/(?P<topic_id>d+)/$', views.topic, name='topic'),
    ]

    正则表达式:r'^topics/(?P<topic_id>d+)'

    r让Django将这个字符串视为原始字符串,并指出正则表达式包含在引号内。/(?P<topic_id>d+)/与包含在俩个斜杠内的整数匹配,并将这个整数存储在一个名为topic_id的实参中。这部分表达式俩边的括号捕获URL中的值;?<topic_id>将匹配的值存储到topic_id中;而表达式d+与包含在俩个斜杠内的任何数字都匹配,不管这个数字为多少位。

    二十三、视图

    函数topic()需要从数据库中获取指定的主题以及与之相关联的所有条目。

    views.py
    def topic(request, topic_id):
        """显示单个主题及其所有的条目"""
        topic = Topic.objects.get(id=topic_id)
        entries = topic.entry_set.order_by('-date_added')
        context = {'topic' : topic, 'entries': entries}
        return render(request, 'learning_logs/topic.html', context)

    这个函数接受正则表达式?<topic_id>d+捕获的值,并将其存储到topic_id中。date_add前面的减号指定按降序排序。

    二十三、模板

    topic.html
    {% extends "learning_logs/base.html" %}
     
    {% block content %}
        <p>Topic: {{ topic }}</p>
        <p>Entries:</p>
        <ul>
        {% for entry in entries %}
            <li>
                <p>{{ entry.date_added |date:'M d,Y H:i' }}</p>
                <p>{{ entry.text|linebreaks }}</p>
            </li>
        {% empty %}
            <li>
                There are no entries for this topic yet.
            </li>
        {% endfor %}
        </ul>
    {% endblock content %}

    每个项目列表都将列出两项信息:条目的时间戳和完整的文本。为列出时间戳,我们显示属性date_added的值。在Django模版中,竖线(|)表示模版过滤器——对模版变量的值进行修改的函数。过滤器date:'M d,Y H:i'以这样的格式显示时间戳。接下来一行显示text完整值,而不仅仅是entry的前50个字符。过滤器linebreaks将包含换行符的长条目转换为浏览器能够理解的格式,以免显示为一个不间断的文本块。

    二十四、将显示所有主题的页面中的每个主题都设置为链接

    topics.html
    {% extends "learning_logs/base.html" %}
     
    {% block content %}
        <p>Topics</p>
        <ul>
        {% for topic in topics %}
            <li>
                <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
            </li>
        {% empty %}
            <li>No topics have been added yet.</li>
        {% endfor %}
        </ul>
    {% endblock content %}


  • 相关阅读:
    选择排序
    插入排序
    冒泡排序
    java实现串的匹配和替换
    动态字符串的存储结构的实现
    静态串的存储结构以及增删改查
    链式队列的操作实现
    java中程序的执行的原理如怎么创建空间,创建对象等
    java中的环境变量的配置
    java的JVM以及java中代码的运行过程
  • 原文地址:https://www.cnblogs.com/CSgarcia/p/13292472.html
Copyright © 2011-2022 走看看