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': '',    }}
配置和迁移项目到MariaDB

cd ~/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.")在命令行下运行
python manage.py migrate
django会自动在数据库中(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.
5.创建模块
编辑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 polls
django通过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的模式:


原创粉丝点击