如何创建一个Django网站

如题所述

    创建项目
    运行下面命令就可以创建一个 django 项目,项目名称叫 mysite :

    $ django-admin.py startproject mysite
    创建后的项目目录如下:

    mysite
    ├── manage.py
    └── mysite
       â”œâ”€â”€ __init__.py
       â”œâ”€â”€ settings.py
       â”œâ”€â”€ urls.py
       â””── wsgi.py

    1 directory, 5 files
    说明:

    __init__.py :让 Python 把该目录当成一个开发包 (即一组模块)所需的文件。 这是一个空文件,一般你不需要修改它。
    manage.py :一种命令行工具,允许你以多种方式与该 Django 项目进行交互。 键入python manage.py help,看一下它能做什么。 你应当不需要编辑这个文件;在这个目录下生成它纯是为了方便。
    settings.py :该 Django 项目的设置或配置。
    urls.py:Django项目的URL路由设置。目前,它是空的。
    wsgi.py:WSGI web 应用服务器的配置文件。更多细节,查看 How to deploy with WSGI
    接下来,你可以修改 settings.py 文件,例如:修改 LANGUAGE_CODE、设置时区 TIME_ZONE

    SITE_ID = 1

    LANGUAGE_CODE = 'zh_CN'

    TIME_ZONE = 'Asia/Shanghai'

    USE_TZ = True
    上面开启了 [Time zone](https://docs.djangoproject.com/en/1.7/topics/i18n/timezones/) 特性,需要安装 pytz:

    $ sudo pip install pytz
    2. 运行项目
    在运行项目之前,我们需要创建数据库和表结构,这里我使用的默认数据库:

    $ python manage.py migrate
    Operations to perform:
     Apply all migrations: admin, contenttypes, auth, sessions
    Running migrations:
     Applying contenttypes.0001_initial... OK
     Applying auth.0001_initial... OK
     Applying admin.0001_initial... OK
     Applying sessions.0001_initial... OK
    然后启动服务:

    $ python manage.py runserver
    你会看到下面的输出:

    Performing system checks...

    System check identified no issues (0 silenced).
    January 28, 2015 - 02:08:33
    Django version 1.7.1, using settings 'mysite.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    这将会在端口8000启动一个本地服务器, 并且只能从你的这台电脑连接和访问。 既然服务器已经运行起来了,现在用网页浏览器访问 http://127.0.0.1:8000/。你应该可以看到一个令人赏心悦目的淡蓝色 Django 欢迎页面它开始工作了。

    你也可以指定启动端口:

    $ python manage.py runserver 8080
    以及指定 ip:

    $ python manage.py runserver 0.0.0.0:8000
    3. 创建 app
    前面创建了一个项目并且成功运行,现在来创建一个 app,一个 app 相当于项目的一个子模块。

    在项目目录下创建一个 app:

    $ python manage.py startapp polls
    如果操作成功,你会在 mysite 文件夹下看到已经多了一个叫 polls 的文件夹,目录结构如下:

    polls
    ├── __init__.py
    ├── admin.py
    ├── migrations
    │   └── __init__.py
    ├── models.py
    ├── tests.py
    └── views.py

    1 directory, 6 files
    4. 创建模型
    每一个 Django Model 都继承自 django.db.models.Model
    在 Model 当中每一个属性 attribute 都代表一个 database field
    通过 Django Model API 可以执行数据库的增删改查, 而不需要写一些数据库的查询语句
    打开 polls 文件夹下的 models.py 文件。创建两个模型:

    import datetime
    from django.db import models
    from django.utils import timezone

    class Question(models.Model):
       question_text = models.CharField(max_length=200)
       pub_date = models.DateTimeField('date published')

       def was_published_recently(self):
           return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

    class Choice(models.Model):
       question = models.ForeignKey(Question)
       choice_text = models.CharField(max_length=200)
       votes = models.IntegerField(default=0)
    然后在 mysite/settings.py 中修改 INSTALLED_APPS 添加 polls:

    INSTALLED_APPS = (
       'django.contrib.admin',
       'django.contrib.auth',
       'django.contrib.contenttypes',
       'django.contrib.sessions',
       'django.contrib.messages',
       'django.contrib.staticfiles',
       'polls',
    )
    在添加了新的 app 之后,我们需要运行下面命令告诉 Django 你的模型做了改变,需要迁移数据库:

    $ python manage.py makemigrations polls
    你会看到下面的输出日志:

    Migrations for 'polls':
     0001_initial.py:
       - Create model Choice
       - Create model Question
       - Add field question to choice
    你可以从 polls/migrations/0001_initial.py 查看迁移语句。

    运行下面语句,你可以查看迁移的 sql 语句:

    $ python manage.py sqlmigrate polls 0001
    输出结果:

    BEGIN;
    CREATE TABLE "polls_choice" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL);
    CREATE TABLE "polls_question" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "question_text" varchar(200) NOT NULL, "pub_date" datetime NOT NULL);
    CREATE TABLE "polls_choice__new" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "choice_text" varchar(200) NOT NULL, "votes" integer NOT NULL, "question_id" integer NOT NULL REFERENCES "polls_question" ("id"));
    INSERT INTO "polls_choice__new" ("choice_text", "votes", "id") SELECT "choice_text", "votes", "id" FROM "polls_choice";
    DROP TABLE "polls_choice";
    ALTER TABLE "polls_choice__new" RENAME TO "polls_choice";
    CREATE INDEX polls_choice_7aa0f6ee ON "polls_choice" ("question_id");

    COMMIT;
    你可以运行下面命令,来检查数据库是否有问题:

    $ python manage.py check
    再次运行下面的命令,来创建新添加的模型:

    $ python manage.py migrate
    Operations to perform:
     Apply all migrations: admin, contenttypes, polls, auth, sessions
    Running migrations:
     Applying polls.0001_initial... OK
    总结一下,当修改一个模型时,需要做以下几个步骤:

    修改 models.py 文件
    运行 python manage.py makemigrations 创建迁移语句
    运行 python manage.py migrate,将模型的改变迁移到数据库中
    你可以阅读 django-admin.py documentation,查看更多 manage.py 的用法。

    创建了模型之后,我们可以通过 Django 提供的 API 来做测试。运行下面命令可以进入到 python shell 的交互模式:

    $ python manage.py shell
    下面是一些测试:

    >>> from polls.models import Question, Choice   # Import the model classes we just wrote.

    # No questions are in the system yet.
    >>> Question.objects.all()
    []

    # Create a new Question.
    # Support for time zones is enabled in the default settings file, so
    # Django expects a datetime with tzinfo for pub_date. Use timezone.now()
    # instead of datetime.datetime.now() and it will do the right thing.
    >>> from django.utils import timezone
    >>> q = Question(question_text="What's new?", pub_date=timezone.now())

    # Save the object into the database. You have to call save() explicitly.
    >>> q.save()

    # Now it has an ID. Note that this might say "1L" instead of "1", depending
    # on which database you're using. That's no biggie; it just means your
    # database backend prefers to return integers as Python long integer
    # objects.
    >>> q.id
    1

    # Access model field values via Python attributes.
    >>> q.question_text
    "What's new?"
    >>> q.pub_date
    datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

    # Change values by changing the attributes, then calling save().
    >>> q.question_text = "What's up?"
    >>> q.save()

    # objects.all() displays all the questions in the database.
    >>> Question.objects.all()
    [<Question: Question object>]
    打印所有的 Question 时,输出的结果是 [<Question: Question object>],我们可以修改模型类,使其输出更为易懂的描述。修改模型类:

    from django.db import models

    class Question(models.Model):
       # ...
       def __str__(self):              # __unicode__ on Python 2
           return self.question_text

    class Choice(models.Model):
       # ...
       def __str__(self):              # __unicode__ on Python 2
           return self.choice_text
    接下来继续测试:

    >>> from polls.models import Question, Choice

    # Make sure our __str__() addition worked.
    >>> Question.objects.all()
    [<Question: What's up?>]

    # Django provides a rich database lookup API that's entirely driven by
    # keyword arguments.
    >>> Question.objects.filter(id=1)
    [<Question: What's up?>]
    >>> Question.objects.filter(question_text__startswith='What')
    [<Question: What's up?>]

    # Get the question that was published this year.
    >>> from django.utils import timezone
    >>> current_year = timezone.now().year
    >>> Question.objects.get(pub_date__year=current_year)
    <Question: What's up?>

    # Request an ID that doesn't exist, this will raise an exception.
    >>> Question.objects.get(id=2)
    Traceback (most recent call last):
       ...
    DoesNotExist: Question matching query does not exist.

    # Lookup by a primary key is the most common case, so Django provides a
    # shortcut for primary-key exact lookups.
    # The following is identical to Question.objects.get(id=1).
    >>> Question.objects.get(pk=1)
    <Question: What's up?>

    # Make sure our custom method worked.
    >>> q = Question.objects.get(pk=1)

    # Give the Question a couple of Choices. The create call constructs a new
    # Choice object, does the INSERT statement, adds the choice to the set
    # of available choices and returns the new Choice object. Django creates
    # a set to hold the "other side" of a ForeignKey relation
    # (e.g. a question's choice) which can be accessed via the API.
    >>> q = Question.objects.get(pk=1)

    # Display any choices from the related object set -- none so far.
    >>> q.choice_set.all()
    []

    # Create three choices.
    >>> q.choice_set.create(choice_text='Not much', votes=0)
    <Choice: Not much>
    >>> q.choice_set.create(choice_text='The sky', votes=0)
    <Choice: The sky>
    >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)

    # Choice objects have API access to their related Question objects.
    >>> c.question
    <Question: What's up?>

    # And vice versa: Question objects get access to Choice objects.
    >>> q.choice_set.all()
    [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
    >>> q.choice_set.count()
    3

    # The API automatically follows relationships as far as you need.
    # Use double underscores to separate relationships.
    # This works as many levels deep as you want; there's no limit.
    # Find all Choices for any question whose pub_date is in this year
    # (reusing the 'current_year' variable we created above).
    >>> Choice.objects.filter(question__pub_date__year=current_year)
    [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]

    # Let's delete one of the choices. Use delete() for that.
    >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
    >>> c.delete()
    >>>
    上面这部分测试,涉及到 django orm 相关的知识,详细说明可以参考 Django中的ORM。

    5. 管理 admin
    Django有一个优秀的特性, 内置了Django admin后台管理界面, 方便管理者进行添加和删除网站的内容.

    新建的项目系统已经为我们设置好了后台管理功能,见 mysite/settings.py:

    INSTALLED_APPS = (
       'django.contrib.admin', #默认添加后台管理功能
       'django.contrib.auth',
       'django.contrib.contenttypes',
       'django.contrib.sessions',
       'django.contrib.messages',
       'django.contrib.staticfiles',
       'mysite',
    )
    同时也已经添加了进入后台管理的 url, 可以在 mysite/urls.py 中查看:

    url(r'^admin/', include(admin.site.urls)), #可以使用设置好的url进入网站后台
    接下来我们需要创建一个管理用户来登录 admin 后台管理界面:

    $ python manage.py createsuperuser
    Username (leave blank to use 'june'): admin
    Email address:
    Password:
    Password (again):
    Superuser created successfully.
    总结
    最后,来看项目目录结构:

    mysite
    ├── db.sqlite3
    ├── manage.py
    ├── mysite
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   ├── wsgi.py
    ├── polls
    │   ├── __init__.py
    │   ├── admin.py
    │   ├── migrations
    │   │   ├── 0001_initial.py
    │   │   ├── __init__.py
    │   ├── models.py
    │   ├── templates
    │   │   └── polls
    │   │       ├── detail.html
    │   │       ├── index.html
    │   │       └── results.html
    │   ├── tests.py
    │   ├── urls.py
    │   ├── views.py
    └── templates
       â””── admin
           â””── base_site.htm      
    通过上面的介绍,对 django 的安装、运行以及如何创建视 图和模型有了一个清晰的认识,接下来就可以深入的学习 django 的自动化测试、持久化、中间件、国 际 化等知识。


如果解决了您的问题请采纳!
如果未解决请继续追问

温馨提示:答案为网友推荐,仅供参考
相似回答