第一步

在你开始之前

确保满足以下先决条件:

本教程是根据以下假设创建的:

  • Python 3.4.1。

  • Django 1.x(高于 Django 1.10)。

  • 本教程中使用的示例类似于Django 文档中使用的示例。示例项目可以从这里下载。

创建一个新项目

实际上,所有新项目都以相同的方式创建:通过单击欢迎屏幕快速启动区域中的新建项目按钮:

欢迎画面

如果您已经打开了一个项目,请选择File |创建一个新项目。新项目...来自主菜单。

然后,选择所需的项目类型(这里是 Django)。指定项目名称和位置。

Python 最佳实践是为每个项目创建一个 virtualenv。在大多数情况下,PyCharm 会自动创建一个新的虚拟环境,您无需进行任何配置。不过,您可以预览和修改 venv 选项。展开Python Interpreter: New Virtualenv Environment节点并选择用于创建新虚拟环境的工具。让我们选择Virtualenv工具,并指定环境的位置和用于新虚拟环境的基本 Python 解释器。

接下来,展开更多设置节点并指定与 Django 相关的设置。在Application name字段中指定应用程序名称(这里是polls)。

选择项目类型

单击创建- Django 项目已准备就绪。

探索项目结构

如上所述,基本上,存根项目已准备就绪。它包含特定于框架的文件和目录。当您创建任何受支持类型的项目时也会发生同样的情况,无论是 Pyramid 还是 Google App Engine。

让我们看看新项目的结构如何在项目工具窗口中可见。

项目工具窗口的项目视图

默认情况下显示此视图。它显示了 Django 特定的项目结构:pollsmysite目录;此外,您还会看到manage.pysettings.py文件。

请注意,您无法在此视图中看到.idea目录:

项目视图

项目工具窗口的项目文件视图

如果您想查看.idea目录的内容,请选择视图Project Files:如您所见,此视图显示相同的目录和文件,加上.idea目录,因为它位于项目根目录下:

项目文件

让我们回到项目视图。

我们在项目视图中看到了什么?

  • mysite目录是您项目的容器。在项目视图中,它用粗体字表示。

  • manage.py:这是一个命令行实用程序,可让您与 Django 项目进行交互。有关详细信息,请参阅Django 文档

  • 嵌套目录mysite是您项目的实际 Python 包。

  • mysite/__init__.py:这个空文件告诉 Python 这个目录应该被认为是一个 Python 包。

  • mysite/settings.py:此文件包含您的 Django 项目的配置

  • mysite/urls.py:该文件包含Django 项目的 URL 声明

  • mysite/wsgi.py:这个文件定义了一个与 WSGI 兼容的 web 服务器的入口点来服务你的项目。有关更多详细信息,请参阅如何使用 WSGI进行部署。

  • 嵌套目录polls包含开发 Django 应用程序所需的所有文件(此时,这些文件是空的):

    • 同样,polls/_init_.py告诉 Python 这个目录应该被认为是一个 Python 包。

    • polls/models.py:在这个文件中,我们将为我们的应用程序创建模型

    • polls/views.py:在这个文件中,我们将创建视图

  • 模板目录现在是空的。它应该包含模板文件。

  • 嵌套目录迁移现在仅包含包文件_init_.py,但将来将用于将您对模型所做的更改(添加字段、删除模型等)传播到数据库模式中。在此处阅读迁移说明。

请注意,您可以根据需要创建任意数量的 Django 应用程序。要将应用程序添加到项目中,请运行manage.py实用程序的startapp任务(工具 | 运行 manage.py 任务,然后在控制台中键入)。startapp

配置数据库

现在,当项目存根准备好时,让我们进行一些微调。打开以编辑settings.py。为此,请在项目工具窗口中选择文件,然后按F4。该文件在编辑器中的自己的选项卡中打开。

指定您将在应用程序中使用的数据库。为此,请找到DATABASES变量:单击Ctrl+F,然后在搜索字段中开始输入您要查找的字符串。然后,在该'ENGINE'行中,在点之后添加您的数据库管理系统的名称(您可以使用注释后指定的任何名称,但首先我们将从sqlite3开始。)

在该'NAME'行中,输入所需数据库的名称,即使它尚不存在。

定义数据库

启动 Django 服务器

由于我们谨慎地选择了sqlite3,我们不需要定义其他值(用户凭据、端口和主机)。现在让我们检查一下我们的设置是否正确。这可以很容易地完成:只需启动manage.pyrunserver实用程序的任务:按,然后在manage.py控制台中输入任务名称:Ctrl+Alt+R

在控制台中运行 manage.py

按照建议的链接查看以下页面:

预览页面

创建模型

接下来,打开以编辑文件models.py,并注意 import 语句已经存在。然后键入以下代码:

from django.db import models # 添加以下行: import datetime from django.utils import timezone class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') def __str__(self): return self.question_text def was_published_recently(self): now = timezone.now() return now - datetime.timedelta(days=1) <= self.pub_date <= now was_published_recently.admin_order_field = 'pub_date' was_published_recently。 boolean = True was_published_recently.short_description = '最近发布?' 类选择(models.Model):问题 = models.ForeignKey(问题,on_delete=models.DO_NOTHING,)choice_text = models.CharField(max_length=200)票=模型。

实际上,您可以只复制粘贴,但建议输入 - 它可以帮助您查看强大的 PyCharm 代码完成功能:

使用代码竞争

创建数据库

我们必须为新模型创建表。为此,我们将使用魔法Ctrl+Alt+R快捷方式来调用manage.py控制台。要执行的第一个命令是makemigrations polls

执行 makemigrations

因此,您告诉 Django 已经创建了两个新模型,即ChoiceQuestion,并创建了一个迁移:

移民

接下来,在提示符后,键入以下命令:

sqlmigrate polls 0001

执行 sqlmigrate 池 0001

最后,运行migrate命令在数据库中实际创建这些表:

在数据库中创建表

执行行政职能

首先,创建一个超级用户。为此,请在manage.pycreatesuperuser控制台中键入命令,指定您的电子邮件地址和密码:

创建超级用户

由于我们决定启用站点管理,PyCharm 已经取消了文件urls.py中相应行的注释。

打开polls目录下的admin.py文件进行编辑,看到下面已经存在的代码:

从 django.contrib 导入管理员

但是,我们需要为管理站点启用编辑功能。

准备运行/调试配置

我们现在准备好进入管理页面。当然,很可能运行 Django 服务器,然后转到您的浏览器,在地址栏中输入整个 URL,但是使用 PyCharm 有一个更简单的方法:使用预先配置的 Django 服务器运行配置并稍作修改.

要打开此运行/调试配置进行编辑,请在主工具栏上单击运行/调试配置选择器,然后选择编辑配置(或从主菜单中选择运行|编辑配置):

编辑运行/调试配置

在“运行/调试配置”对话框中,为该运行/调试配置命名(此处为mysite),启用在默认浏览器中运行应用程序(选中复选框“运行浏览器”)并指定默认打开的站点页面(这里这个页面是http://127.0.0.1:8000/admin/):

设置默认网页

启动管理站点

现在,要启动应用程序,请按Shift+F10或单击运行按钮主工具栏以打开标准 Django 站点登录页面:

登录页面

登录后,将显示管理页面。它有一个部分Authentication and Authorization (Groups and Users),但Polls不可用。为什么这样?

我们必须告诉 adminQuestion对象有一个管理界面;为此,让我们打开文件polls/admin.py进行编辑(在项目视图中选择它并按F4),然后输入以下代码:

from django.contrib import admin from .models import Question #this line added admin.site.register(Question)#this line added

再次注意代码完成:

代码完成

刷新页面,看到出现了带有问题的投票部分:

网站管理页面

单击添加以创建一些问题。

编辑 admin.py

但是,每个问题都有多个选择,但仍然没有选择。再次打开以编辑文件polls/admin.py并将其更改如下:

from django.contrib import admin from .models import Choice, Question class ChoiceInline(admin.TabularInline): model = Choice extra = 3 class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text' ]}), ('日期信息', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline] admin.site.register(Question, QuestionAdmin)

现在查看更改问题页面:

更改问题页面

编写视图

打开文件polls/views.py进行编辑并输入以下 Python 代码:

from django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")

接下来,在polls目录中添加一个名为urls.py的新文件,并在其中键入以下代码:

从 django.conf.urls 导入 url 从 . 导入视图 urlpatterns = [ url(r'^$', views.index, name='index'), ]

接下来,打开以编辑文件mysite/urls.py(PyCharm 已经为您创建了该文件)并为索引页面添加一个 URL。您应该最终得到以下代码:

from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^polls/', include('polls.urls')), #this line added url(r'^admin/' , admin.site.urls), ]

现在,打开页面127.0.0.1:8000/polls/并享受:

首页

接下来,让我们添加更多视图。同样,将以下代码添加到文件polls/views.py 中

def detail(request, question_id): return HttpResponse("你正在查看问题 %s。" % question_id) def results(request, question_id): response = "你正在查看问题 %s 的结果。" return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("你正在对问题 %s 投票。" % question_id)

polls.urls通过添加以下url()调用将这些新视图连接到模块中:

从 django.conf.urls 导入 url 从 . 导入视图 urlpatterns = [ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+) /$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views .results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name= '投票'), ]

如果您现在在浏览器中打开相应的页面,您将看到,例如:

申请页面

创建 Django 模板

如您所见,这些页面的设计在视图中是硬编码的。因此,为了使其更具可读性,您必须编辑相应的 Python 代码。然后让我们将输出的可视化表示与 Python 分开 - 为此,让我们创建模板。

打开以编辑文件polls/views.py并将其内容替换为以下代码:

from django.http import HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, render from django.urls import reverse from .models import Question, Choice def index(request): latest_question_list = Question.objects.order_by('-pub_date')[: 5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context) def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, ' polls/detail.html', {'question': question}) def results(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/results.html', {'question' : question}) def vote(request, question_id):question = get_object_or_404(Question, pk=question_id) try: selected_choice = question.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'polls/detail. html', { 'question': question, 'error_message': "You didn't select a choice.", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('polls:results' , args=(question.id,)))error_message': "你没有选择一个选项。", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))error_message': "你没有选择一个选项。", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

顺便提一下,帮助您创建导入语句的导入助手。

您注意到的第一件事是对页面index.html的未解决引用:

查看.py代码

PyCharm 建议快速修复:如果单击灯泡或按Alt+Enter,则会在模板文件夹中创建相应的模板文件(请注意,PyCharm 还会创建该模板应驻留的目录polls ):

创建模板

到目前为止,文件index.html是空的。向其中添加以下代码:

{% load staticfiles %} <link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" /> {% if latest_question_list %} <ul> {% for latest_question_list 中的问题 %} <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>没有可用的民意调查。</p> {% endif %}

注意模板文件中的代码完成!例如,当您键入开头时{%,PyCharm 会自动添加匹配的结尾%},将插入符号放在将来输入的位置。在 HTML 标记中,也可以使用代码完成。

注意分别出现在文件views.pyindex.htmlhtml类型中的图标和图标:Python类型

查看html和python代码

这些图标使您可以立即在视图方法及其模板之间跳转。在文章在模板和视图之间导航第 6 部分。Django-specific navigation中阅读有关这种导航的更多信息。

使用样式表

正如您在视图文件index.html中看到的,有一个对样式表的引用,但未解决:

通过以下方式解决此引用:

  1. 创建目录。为此,在项目视图中,选择 Python 包polls,然后按Alt+Insert

    在出现的弹出菜单上,选择Directory,并指定目录结构的名称static/polls

  2. 接下来,在这个目录中创建一个样式表。为此,请选择最里面的目录polls,按Alt+Insert,选择选项Stylesheet,然后在打开的对话框中输入样式。

  3. 根据您的喜好,为创建的样式表提供一些内容。例如,我们希望看到绿色问题的项目符号列表:

    li a { 颜色:绿色;}

我们到了!

现在让我们检查可用民意调查的列表。我们的管理站点已经在运行,访问包含投票列表的页面(索引页面)的最简单方法是指定其 URL:在浏览器的地址栏中,而不是/admin/,键入/polls / :

民意调查

测试它…

现在让我们看看 PyCharm 如何帮助简化应用程序的测试。

polls目录中已经有文件tests.py 。到目前为止,这个文件是空的。自然,建议将新测试放在这个特定文件中。例如,我们想确保我们的投票不为空:

从 django.urls 导入 datetime 从 django.test 导入反向 从 django.utils 导入 TestCase 从 .models 导入时区 导入 Question def create_question(question_text, days): time = timezone.now() + datetime.timedelta(days=days) return Question.objects.create(question_text=question_text, pub_date=time) class QuestionViewTests(TestCase): def test_index_view_with_no_questions(self): """ 如果不存在问题,则应显示适当的消息。""" response = self.client。 get(reverse('index')) self.assertEqual(response.status_code, 200) self.assertContains(response, "没有可用的民意调查。") self.assertQuerysetEqual(response.context['latest_question_list'], [])

要运行此测试,请在编辑器中右键单击文件tests.py的背景,选择Run选项,或者只需按Ctrl+Shift+F10。PyCharm 建议两个选项:运行 UnitTest(定义为默认测试运行程序)或 Django 测试。

测试结果显示在Run工具窗口的Test Runner选项卡中:

运行测试

概括

这个简短的教程就结束了。您已成功创建并启动了一个简单的 Django 应用程序。让我们重复一下在 PyCharm 的帮助下所做的事情:

  • 已创建 Django 项目和应用程序

  • Django 服务器启动

  • 已配置的数据库

  • 创建的模型、视图和模板

  • 应用程序启动

  • 创建和执行的测试

最后修改:2021 年 12 月 22 日