确保满足以下先决条件:
本教程已经创建了以下假设:
实际上,所有新项目的创建方式都是相同的:通过单击欢迎屏幕快速启动区域中的创建新项目按钮:
如果您有一个已经打开的项目,请通过选择创建一个新项目 在主菜单上。
然后,选择所需的项目类型(这里是Django)。指定项目名称和位置,用于该项目的Python解释器(记住,至少有一个Python解释器是本教程的先决条件之一!)和应用程序名称(这里是轮询)。
点击创建 - Django项目已经准备就绪。
如上所述,基本上,存根项目已经准备就绪。它包含特定于框架的文件和目录。当您创建任何支持类型的项目时,也会发生同样的情况,无论是Pyramid还是Google App Engine。
让我们来看看在Project工具窗口中新建项目的结构是否可见。
该视图默认显示。它显示了Django特定的项目结构 polls
和mysite
目录; 另外,你可以看到 manage.py
和settings.py
文件。
请注意,您无法.idea
在此视图中看到该目录:
如果由于某些原因,您希望看到目录的内容.idea
,请选择视图项目文件:如您所见,此视图显示相同的目录和文件以及.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
:在这个文件中,我们将 创建视图。templates
目录现在是空的。它应该包含模板文件。migrations
现在只包含包文件 _init_.py
,但将来会用于将您对模型所做的更改(添加字段,删除模型等)传播到数据库模式中。阅读这里的迁移说明。请注意,您可以根据需要创建多个Django应用程序。要将应用程序添加到项目中,请运行该实用程序的 startapp
任务manage.py
(,然后startapp
在控制台中输入)。
现在,当项目存根准备就绪时,让我们做一些微调。打开进行编辑settings.py
。要做到这一点,在项目工具窗口中选择文件,然后按F4。该文件在编辑器的自己的选项卡中打开。
指定您要在应用程序中使用的数据库。为此,找到 DATABASES
变量:单击Ctrl+F,然后在搜索字段中输入您要查找的字符串。然后,在该'ENGINE'
行中,添加点数据库管理系统的名称(可以使用任何在注释之后指定的名称,但在开始时我们将开始sqlite3
)。
在该'NAME'
行中,输入所需数据库的名称,即使它尚不存在。
由于我们谨慎选择sqlite3
,我们不需要定义其他值(用户凭证,端口和主机)。现在我们来看看我们的设置是否正确。这可以很容易地完成:只需启动 实用程序的runserver
任务manage.py
:按Ctrl+Alt+R,然后在manage.py
控制台中输入任务名称 :
按照建议的链接,并看到以下页面:
接下来,打开编辑该文件models.py
,并注意导入语句已经在那里。然后键入下面的代码:
from django.db import models# the following lines added:import datetimefrom django.utils import timezoneclass 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_puplished_recently(self): now = timezone.now() return now - datetime.timedelta(days=1) <= self.pub_date <= now was_puplished_recently.admin_order_field = 'pub_date' was_puplished_recently.boolean = True was_puplished_recently.short_description = 'Published recently?'class Choice(models.Model): question = models.ForeignKey(Question) choice_test = models.CharField(max_length=200) votes = models.IntegerField(default=0) def __str__(self): return self.choice_test
复制
事实上,你可以复制粘贴,但打字是明智的 - 它可以帮助你看到强大的PyCharm的代码完成在行动:
我们必须为新模型创建表格。为此,我们将使用魔术Ctrl+Alt+R 快捷键来调用manage.py
控制台。首先执行的命令是makemigration
:
因此,你告诉Django的这两款新车型已经建立,即Choice
和Question
,并创建了一个迁移:
接下来,在提示符之后,键入以下命令:
sqlmigrate polls 0001
最后,运行migrate
命令在数据库中实际创建这些表:
首先,创建一个超级用户。为此,请superuser
在manage.py
控制台中键入命令 ,指定您的电子邮件地址和密码:
由于我们已经决定启用网站管理,PyCharm已经取消了文件中对应的行的注释urls.py
。
但是,我们需要为管理网站启用编辑功能。为此,请打开 admin.py
目录中的polls
文件进行编辑,然后输入以下代码:
from django.contrib import admin# these lines added:from django.contrib import adminfrom .models import Choice, Questionclass ChoiceInline(admin.TabularInline): model = Choice extra = 3class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline]admin.site.register(Question, QuestionAdmin)
再次注意代码完成:
我们现在准备进入管理页面。当然,可以运行Django服务器,然后进入浏览器,在地址栏中输入整个URL,但使用PyCharm有一个更简单的方法:使用预配置的Django服务器运行配置,稍作修改。
要打开此运行/调试配置以进行编辑,请在主工具栏上单击运行/调试配置选择器,然后选择编辑配置(或者选择 主菜单上的):
在Run / Dug Configuration对话框中,为这个运行/调试配置指定一个名称(在这里mysite
),启用在默认浏览器中运行应用程序(选中复选框运行浏览器),并指定默认打开的站点的页面(这里是这个页面http://127.0.0.1:8000/admin/
):
现在,要启动应用程序,按Shift+F10,或点击主工具栏打开标准的Django网站登录页面:
登录后,将显示管理页面。它具有认证和授权(组和用户)部分,但民意调查不可用。为什么这样?
我们必须告诉管理员,Question对象有一个管理界面; 要做到这一点,让我们打开文件 polls/admin.py
进行编辑(在“项目”视图中选择并按下 F4),然后输入以下代码:
from django.contrib import adminfrom .models import Question #this line addedadmin.site.register(Question)#this line added
刷新页面,看到有问题的民意调查部分出现:
点击添加创建一些问题。
但是,每个问题都有一些选择,但是选择仍然不可用。再次,打开编辑文件polls/admin.py
并将其更改如下:
from django.contrib import adminfrom .models import Choice, Questionclass ChoiceInline(admin.TabularInline): model = Choice extra = 3class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question_text']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] inlines = [ChoiceInline]admin.site.register(Question, QuestionAdmin
打开文件polls/views.py
进行编辑并输入以下Python代码:
from django.http import HttpResponsedef index(request): return HttpResponse("Hello, world. You're at the polls index.")
polls
名称所在的目录中,
urls.py
并在其中键入以下代码:
from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^$', views.index, name='index'),]
mysite/urls.py
(PyCharm已经为您创建)并添加索引页面的URL。你应该结束以下代码:
from django.conf.urls import include, urlfrom django.contrib import adminurlpatterns = [ url(r'^polls/', include('polls.urls')), #this line added url(r'^admin/', include(admin.site.urls)),]
127.0.0.1:8000/polls/
并享受:
接下来,我们添加更多视图。再一次,将下面的代码添加到文件中polls/views.py
:
def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id)def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id)def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
如你所见,这些页面的设计如果在视图中被硬编码。因此,为了使其更具可读性,您必须编辑相应的Python代码。然后让我们分离Python输出的可视化表示 - 为此,我们创建模板。
打开编辑文件polls/views.py
并更改方法 index
(顺便说一句,注意导入助手可以帮助您创建导入语句)。
from django.core.urlresolvers import reversefrom django.http import HttpResponseRedirectfrom django.shortcuts import render, get_object_or_404from django.utils import timezonefrom django.views import genericfrom .models import Choice, Questionclass IndexView(generic.ListView): template_name = "polls/index.html" context_object_name = "latest_question_list" def get_queryset(self): return Question.objects.filter( pub_date__lte=timezone.now() ).order_by('-pub_date')[:5]class DetailView(generic.DetailView): model = Question template_name = "polls/detail.html" def get_queryset(self): """ Excludes any questions that aren't published yet. """ return Question.objects.filter(pub_date__lte=timezone.now())class ResultsView(generic.DetailView): model = Question template_name = "polls/results.html" def vote(request, question_id): p = get_object_or_404(Question, pk=question_id) try: selected_choice = p.choice_set.get(pk=request.POST['choice']) except (KeyError, Choice.DoesNotExist): return render(request, 'polls/detail.html', { 'question': p, 'error_message': "You didn't select a choice", }) else: selected_choice.votes += 1 selected_choice.save() return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))
index.html
:
PyCharm提出了一个快速的解决方法:如果你点击灯泡,或者按下 Alt+Enter,在模板文件夹中创建相应的模板文件(注意PyCharm也创建了polls
模板应该驻留的目录):
现在,文件index.html
是空的。将下面的代码添加到它:
{% load staticfiles %}{% if latest_question_list %} {% for question in latest_question_list %} - {{ question.question_text }}
{% endfor %}
{% else %}No polls are available.
{% endif %}
注意模板文件中的代码完成!例如,当您键入开头时 {%
,PyCharm会%}
自动添加匹配的关闭项,将光标放在将来输入的位置。在HTML
标签中,代码完成也是可用的。
注意图标,并出现在文件左侧排水沟views.py
和index.html
分别为:
这些图标使您能够立即在视图方法和模板之间跳转。在文章“ 在模板和视图之间导航”中阅读有关此类导航的更多信息。
正如你可以在视图文件中看到的那样index.html
,有一个对样式表的引用,并且没有解决:
通过以下方式解决该参考:
polls
,然后按Alt+Insert。在出现的弹出式菜单上,选择“ 目录”,然后指定目录结构的名称static/polls
。
polls
,按Alt+Insert,选择样式表选项 ,然后在打开的对话框中输入样式。li a {color: green;}
复制
现在我们来看看可用的民意调查清单。我们的管理站点已经在运行,访问包含轮询列表(索引页面)的页面的最简单方法是指定其URL:在浏览器的地址栏中,而不是/admin/
键入/polls/
:
现在让我们看看PyCharm如何帮助简化测试你的应用程序。
已经有文件tests.py
的polls
目录。现在,这个文件是空的。当然,建议在这个特定的文件中放置新的测试。例如,我们想确保我们的调查不是空的:
import datetimefrom django.core.urlresolvers import reversefrom django.test import TestCasefrom django.utils import timezonefrom .models import Questiondef 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): """ If no questions exist, an appropriate message should be displayed. """ response = self.client.get(reverse('polls:index')) self.assertEqual(response.status_code, 200) self.assertContains(response, "No polls are available.") self.assertQuerysetEqual(response.context['latest_question_list'], [])
要运行此测试,请tests.py
在编辑器中右键单击该文件的背景,然后选择Run Tests:polls.tests选项,或者只需按下Ctrl+Shift+F10:
测试结果显示在测试运行者:
这个简短的教程已经结束。您已成功创建并启动了一个简单的Django应用程序。让我们重复一下PyCharm的帮助:
本文翻译自https://www.jetbrains.com/help/pycharm/5.0/creating-and-running-your-first-django-project.html?origin=old_help