zoukankan      html  css  js  c++  java
  • 初始Django

    Django 最初被设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发

    01 Django 项目初期配置

    1.创建一个Django 项目

    django-admin startproject 项目名,例如名字 mysite

    产生的mysite项目目录如下

          mysite
          --mysite
          ----__init__.py  # 使目录mysite成为包
          ----urls.py        # Django 路由系统:url-->函数
          ----settings.py  # Django 配置文件
          ----wsgi.py       # 用于定义 Django用socket,wsgiref,uwsgi
          --manage.py    # 对当前Django程序所有操作可以基于

    或者使用官方定义

    • 最外层的:file: mysite/ 根目录只是你项目的容器, Django 不关心它的名字,你可以将它重命名为任何你喜欢的名字。
    • manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。你可以阅读 django-admin and manage.py 获取所有 manage.py 的细节。
    • 里面一层的 mysite/ 目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如 mysite.urls).
    • mysite/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。如果你是 Python 初学者,阅读官方文档中的 更多关于包的知识。
    • mysite/settings.py:Django 项目的配置文件。如果你想知道这个文件是如何工作的,请查看 Django settings 了解细节。
    • mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。阅读 URL调度器 文档来获取更多关于 URL 的内容。
    • mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。阅读 如何使用 WSGI 进行部署 了解更多细节

    2.使用命令:python manage.py runserver


    即启动项目服务

    02 设计模型

    1.数据-模型语句

    Django 无需数据库就可以使用,它提供了 对象关系映射器 通过此技术,你可以使用 Python 代码来描述数据库结构。Django自带数据库sqlite,其设置在mysite/mysite/settings.py

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

    如果想设计使用mysql,可以使用如下代码替换

            DATABASES = {
                'default': {
                  'ENGINE': 'django.db.backends.mysql',
                  'NAME':'dbname',
                  'USER': 'root',
                  'PASSWORD': 'xxx',
                  'HOST': '',
                  'PORT': '',
                }
            }

    2.在此之前需要使用App中的数据模型(model)来创建表和字段

    命令:python manage.py startapp func1   其中func1是app的名字 

    其中func1的目录如下 

    func1
    --migrations       # 关于数据迁移
    ----__init__.py
    --__init__.py
    --admin.py         # 管理文件   
    --apps.py          # app 信息
    --models.py        # 数据模型
    --tests.py         # 测试代码及性能
    --views.py         # 视图

    在/func1/models.py书写如下代码

    from django.db import models
    
    class Reporter(models.Model):
        full_name = models.CharField(max_length=70)
    
        def __str__(self):
            return self.full_name
    
    class Article(models.Model):
        pub_date = models.DateField()
        headline = models.CharField(max_length=200)
        content = models.TextField()
        reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.headline

    03 app准备工作

    1.在应用之前需要注册app,打开settings.py

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
    ]

    在代码最后加上:

    'func1.apps.Func1Config',

    04 应用数据模型

    1.执行命令创建数据库表

    python manage.py makemigrations
    python manage.py migrate

    说明:这个 migrate 命令查找你所有可用的模型并将在数据库中创建那些不存在的表,还可提供了可选的 丰富 schema 控制

    2.查看数据库


    3.查看表中内容

    reporter 表中字段


    article 表中字段


    04 享用便捷API

    # Import the models we created from our "news" app
    >>> from news.models import Article, Reporter
    >>> Reporter.objects.all()
    <QuerySet []>
    # Create a new Reporter.
    >>> r = Reporter(full_name='John Smith')
    # Save the object into the database. You have to call save() explicitly.
    >>> r.save()
    
    # Now it has an ID.
    >>> r.id
    1
    
    # Now the new reporter is in the database.
    >>> Reporter.objects.all()
    <QuerySet [<Reporter: John Smith>]>
    
    # Fields are represented as attributes on the Python object.
    >>> r.full_name
    'John Smith'
    
    # Django provides a rich database lookup API.
    >>> Reporter.objects.get(id=1)
    <Reporter: John Smith>
    >>> Reporter.objects.get(full_name__startswith='John')
    <Reporter: John Smith>
    >>> Reporter.objects.get(full_name__contains='mith')
    <Reporter: John Smith>
    >>> Reporter.objects.get(id=2)
    Traceback (most recent call last):
        ...
    DoesNotExist: Reporter matching query does not exist.
    
    # Create an article.
    >>> from datetime import date
    >>> a = Article(pub_date=date.today(), headline='Django is cool',
    ...     content='Yeah.', reporter=r)
    >>> a.save()
    
    # Now the article is in the database.
    >>> Article.objects.all()
    <QuerySet [<Article: Django is cool>]>
    
    # Article objects get API access to related Reporter objects.
    >>> r = a.reporter
    >>> r.full_name
    'John Smith'
    
    # And vice versa: Reporter objects get API access to Article objects.
    >>> r.article_set.all()
    <QuerySet [<Article: Django is cool>]>
    
    # The API follows relationships as far as you need, performing efficient
    # JOINs for you behind the scenes.
    # This finds all articles by a reporter whose name starts with "John".
    >>> Article.objects.filter(reporter__full_name__startswith='John')
    <QuerySet [<Article: Django is cool>]>
    
    # Change an object by altering its attributes and calling save().
    >>> r.full_name = 'Billy Goat'
    >>> r.save()
    
    # Delete an object with delete().
    >>> r.delete()

    05 规划URLS

    为了设计你自己的 URLconf ,你需要创建一个叫做 URLconf 的 Python 模块。这是网站的目录,它包含了一张 URL 和 Python 回调函数之间的映射表。URLconf 也有利于将 Python 代码与 URL 进行解耦(译注:使各个模块分离,独立)

    1.下面这个 URLconf 适用于前面 Reporter/Article 的例子:在fun1 目录下新建 urls.py 文件,代码如下

    from django.urls import path
    
    from . import views
    
    urlpatterns = [
        path('articles/<int:year>/', views.year_archive),
        path('articles/<int:year>/<int:month>/', views.month_archive),
        path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail),
    ]

    06 编写视图

    1.视图函数的执行结果只可能有两种:返回一个包含请求页面元素的 HttpResponse 对象,或者是抛出 Http404 这类异常。至于执行过程中的其它的动作则由你决定

    2.通常来说,一个视图的工作就是:从参数获取数据,装载一个模板,然后将根据获取的数据对模板进行渲染。下面是一个 index 的视图样例:

    # /func1/views.py
    
    from django.shortcuts import render
    
    from .models import Article
    
    def year_archive(request, year):
        a_list = Article.objects.filter(pub_date__year=year)
        context = {'year': year, 'article_list': a_list}
        return render(request, 'func1/index.html', context)

    07 设计模板

    1.上面的代码加载了 func1/index.html 模板。

    Django 允许设置搜索模板路径,这样可以最小化模板之间的冗余。在 Django 设置中,你可以通过 DIRS 参数指定一个路径列表用于检索模板。如果第一个路径中不包含任何模板,就继续检查第二个,以此类推

    其index.html 代码如下

    {% extends "base.html" %}
    
    {% block title %}Articles for {{ year }}{% endblock %}
    
    {% block content %}
    <h1>Articles for {{ year }}</h1>
    
    {% for article in article_list %}
        <p>{{ article.headline }}</p>
        <p>By {{ article.reporter.full_name }}</p>
        <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
    {% endfor %}
    {% endblock %}

    2.Django 使用了 ''模板继承'' 的概念。这就是 {% extends "base.html" %} 的作用。它的含义是''先加载名为 base 的模板,并且用下面的标记块对模板中定义的标记块进行填充''。简而言之,模板继承可以使模板间的冗余内容最小化:每个模板只需包含与其它文档有区别的内容

    其base.html 代码

    {% load static %}
    <html>
    <head>
        <title>{% block title %}{% endblock %}</title>
    </head>
    <body>
        <img src="{% static "images/LQ6H.png" %}" alt="Logo" />
        {% block content %}{% endblock %}
    </body>
    </html>





    11





  • 相关阅读:
    第十二次作业
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
    Beta 冲刺(5/7)
    Beta 冲刺(4/7)
    Beta 冲刺(3/7)
    Beta 冲刺(2/7)
    第十次作业
    Beta 冲刺(1/7)
    福大软工 · 最终作业
  • 原文地址:https://www.cnblogs.com/LQ6H/p/10134009.html
Copyright © 2011-2022 走看看