django 1.11.X初学指南(1)
来源:互联网 发布:mac电脑怎么截长图 编辑:程序博客网 时间:2024/05/20 18:43
官方初学指南: https://docs.djangoproject.com/en/1.11/intro/tutorial01/
1. 创建一个自己的project
$ django-admin startproject xapp 报错,说是找不到django-admin命令。需要创建软连接了,adango-admin.py的路径是/usr/local/python3.5.2/bin目录下。创建软连接命令为:ln -s /usr/local/python3.5.2/bin/django-admin.py /usr/local/bin
然后再用命令: django-admin.py startproject xapp 就可以创建项目了。由于之前没有查清楚,这个project会直接在你运行命令的目录创建,所以删除(rm -rf xxxxx)刚创建的project的folder,然后在合适的目录下再此运行命令即可。
2.运行该project
命令行中在manage.py目录下运行 python manage.py runserver. 这会利用django自带的一个简单web服务器运行xapp项目。这个自带的web服务器仅仅用来开发使用,不能用在生产环境上。
访问http://127.0.0.1:8000/,你就会看到该项目运行成功了。
3.配置Django连接MariaDB
下载 mysqlclient https://pypi.python.org/pypi/mysqlclient/1.3.9.
解压后进入目录:
$ python setup.py build
$ python setup.py install
安装成功。配置项目中的settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myproject', 'USER': 'xapp', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', }}
配置和迁移项目到MariaDBcd ~/myprojectpython manage.py makemigrationspython manage.py migrate
4.创建poll app
在manage.py的目录下运行命令
python manage.py startapp polls根据官方指引,更改project下的url.py,添加相关行:url(r'^polls/', include('polls.urls')),在pools app下,修改url.py里的urlpatterns,添加url(r'^$', views.index, name='index'),
和views.py.在views.py里面添加from django.http import HttpResponsedef index(request): return HttpResponse("Hello, world. You're at the polls index.")在命令行下运行5.创建模块python manage.py migratedjango会自动在数据库中(xapp\settings.py)创建相应的instance的表。
django自带的instance包括:
django.contrib.admin – The admin site. You’ll use it shortly.
django.contrib.auth – An authentication system.
django.contrib.contenttypes – A framework for content types.
django.contrib.sessions – A session framework.
django.contrib.messages – A messaging framework.
django.contrib.staticfiles – A framework for managing static files.
编辑polls\models.py, 添加两个models:class Question(models.Model): question_text = models.CharField(max_length=200) pub_date = models.DateTimeField('date published')class Choice(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)修改project\settings.py,在installed_apps块中添加polls模块:'polls.apps.PollsConfig',这样django知道我们用了polls app可以去数据库中添加/更新对应的表格,运行下面的命令:python manage.py makemigrations pollsdjango通过migration来将apps和数据库的schema同步
现在通过命令正式作migrate:python manage.py migrate你会发现数据库xapp里面新添加了两张表:
polls_choice和polls_question.这是django自动根据新建的两个models创建的。
记住models修改的三部动作:
- Change your models (in
models.py
). - Run
python manage.py makemigrations
to create migrations for those changes - Run
python manage.py migrate
to apply those changes to the database.
6.django admin
首先创建admin的superuser,用如下命令:
python manage.py createsuperuser然后接着输入用户名(xapp)邮箱和密码(1234abcd)
紧接着把开发服务器启起来:
python manage.py runserver起来后通过浏览器打开http://127.0.0.1:8000/admin/
用刚刚创建的用户登陆管理页面。
为了使我们刚创建的models可以在admin中进行管理,我们需要更改polls/admin.py如下:
from django.contrib import adminfrom .models import Questionadmin.site.register(Question)这时候去刷新admin页面,就会发现我们创建的polls。可以在里面手动添加questions了。
7.创建新的view
在polls/views里面添加新的view
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)把这些新view也添加到polls/urls.py里面:
from django.conf.urls import urlfrom . import viewsurlpatterns = [ # ex: /polls/ 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='vote'),]完毕后,在浏览器中输入http://127.0.0.1:8000/polls/34/, 这就会调用detail的方法,加上results和vote会调用对应的方法。
下面让view正式做点什么:
django view只显示两种结果,一个是从数据库中读取record并显示。一种是显示404页面。我们让index上显示前五个poll:
修改polls/views.py
from django.http import HttpResponsefrom .models import Questiondef index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] output = ', '.join([q.question_text for q in latest_question_list]) return HttpResponse(output)但是这样的view是hardcode的,可以创建django template来显示这些数据:
在polls目录下创建一个叫templates的目录,django会来这里找templates.然后在templates目录下创建一个子目录叫polls,在这个子目录中创建一个index.html文件。html文件的内容为:
{% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul>{% else %} <p>No polls are available.</p>{% endif %}然后更新polls/views.py来调用这个template:
from django.http import HttpResponsefrom django.template import loaderfrom .models import Questiondef index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = { 'latest_question_list': latest_question_list, } return HttpResponse(template.render(context, request))在浏览器中重新加载index就会看到question被列了出来,并且点连接会跳转到details页面。
其实用render()来实现上面调用template更简单,我们将上面的index的方法改写成:
from django.shortcuts import renderfrom .models import Questiondef 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)注意:这个改写,已经不需要在import loader了。
下面定义一个404页面:
在polls/views.py中,修改details的方法如下:
rom django.http import Http404from django.shortcuts import renderfrom .models import Question# ...def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("Question does not exist") return render(request, 'polls/detail.html', {'question': question})
还有一个更简单的写法:
from django.shortcuts import get_object_or_404, renderfrom .models import Question# ...def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question})然后去details.html里面把代码改成:
<h1>{{ question.question_text }}</h1><ul>{% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li>{% endfor %}</ul>在index.html里面,更新成下面这行:
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>这样就可以在模块改名时候不受影响。如果目录更改了,则只要在polls/urls.py里面修改对应的正则表达式就可以了。
那么多个模块下有可能都有detail 的view, 那么怎么区分呢?
答案是需要在polls/urls.py里面添加一个namespaces:
app_name = 'polls'然后在polls的index.html template中更新成包含namespaces的模式:
- django 1.11.X初学指南(1)
- Velocity初学指南1
- Django初学
- 初学django
- Django初学
- python+django初学之安装(一)
- Junit3.X 初学(二)
- Junit3.X 初学 (三)
- 基于Django框架的web设计指南(1)
- 《初学cocos2d-x》- 第一个项目(1)
- R语言初学指南(笔记)
- 初学python、Django
- python初学-04django
- 【Django 初学】 -- 配置Mysql
- django初学习
- django-rest-framework指南(1):序列化
- 《Django Web开发指南》 笔记(一)
- cocos2d-x 初学三问(上)
- LeetCode@HashTable_575_DistributeCandies
- 第三十四天:js总结+重写js的日历
- python字典
- 归并排序
- var, let, const,、 命令的理解和区别;
- django 1.11.X初学指南(1)
- CSS知识部分总结(不含CSS3)
- Linux进程间通信(2)--消息队列
- Android动画:解决通过View.getY()获取初始位置为0的问题
- 常用控件(3)
- 使用iframe的方式实现共用的头部和尾部页面
- SpannableString&SpannableStringBuilder一些简单介绍
- express中session模块
- String类