创建Django 网站的步骤详解


1.安装Python

从https://www.python.org/ftp/python/3.9.1/python-3.9.1-amd64.exe 下载,然后以管理员的方式安装

安装完用 py --version 检查是否安装成功,如果能出现版本号就说明安装成功了。

2.安装虚拟环境

因为Python的版本会一直在更新,那么如果不做虚拟环境,就会受到版本的冲突

 py -m venv py39(环境名称)    环境名称建议用Python版本号

py39\Scripts\activate.bat 激活虚拟环境,然后是这样的:

 在路径的前端有个环境名称加括号。

在该环境下安装的内容,就是用pip 执行的 是不会影响到别的地方的。

释放环境用 

py39\Scripts\deactivate.bat 释放虚拟环境

3.安装Django


在虚拟环境中安装 pip install Django
安装后用 py manage.py --help 进行检查

4.创建网站

py scripts\django-admin.py startproject mysite1

5.运行网站

py manage.py runserver

可以自己定义ip和端口,如下:

python manage.py runserver 0.0.0.0:8000

 6.新增应用

py manage.py startapp polls

把应用的配置添加到总的配置中

 7.新增模型

polls/models.py的代码:

 1 from django.db import models
 2 
 3 # Create your models here.
 4 from django.db import models
 5 
 6 class Question(models.Model):
 7     question_text=models.CharField(max_length=200)
 8     pub_date = models.DateTimeField('date published')
 9 
10 
11 class Choice(models.Model):
12     question =models.ForeignKey(Question,on_delete=models.CASCADE)
13     choice_text = models.CharField(max_length=200)
14     votes = models.IntegerField(default=0)

8.数据库的应用

py manage.py migrate

先完成总站的数据库表同步

添加应用后 

py manage.py makemigrations polls  生成模型

py manage.py migrate 同步到数据库

数据库的操作:

修改模型后要先执行 py manage.py makemigrations xxxx

然后同步 py manage.py migrate

9.添加管理员

py manage.py createsuperuser

 地址栏输入:http://localhost:8000/admin/

 10.把应用管理加入管理平台

修改应用admin.py,代码如下:

 刷新后台管理,如下:

 可以对应用中的对象进行增删改查操作。


11.模板的使用

确保settings.py中有

 然后在应用中创建templates\polls的目录

再创建index.html,如下:

 修改关于首页的views.py中的index的代码:

修改index.html

 运行结果如下:

 12.引入404错误

修改views.py中的detail的代码,如下:

 在templates\polls的目录下新增detail.html,代码如下:

<h1>{{ question.question_text }}h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}li>
{% endfor %}
ul>

输入不存在的就会显示如下:

 13.写个提交文档

把detail.html改成可以提交的文档:

<h1>{{ question.question_text }}h1>

{% if error_message %}<p><strong>{{ error_message }}strong>p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}label><br>
{% endfor %}
<input type="submit" value="Vote">
form>

刷新界面,如下:

 如果界面中的选择项没有值,请在管理员后台添加

把视图views.py中的vote改成:

def vote(request,question_id):
    
    question =get_object_or_404(Question,pk=question_id)
    choice_id=request.POST['choice']
    print('choice_id',choice_id)
    try:
        selected_choice =question.choice_set.get(pk=choice_id)
    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,))) 这个逗号非常重要

14.修改结果界面:

修改views.py中的result

def results(request,question_id):
    question = get_object_or_404(Question,pk=question_id)
    return render(request,'polls/results.html',{'question':question})
 

在templates\polls目录下新增result.html,代码如下:

<h1>{{ question.question_text }}h1>

<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}li>
{% endfor %}
ul>

<a href="{% url 'polls:detail' question.id %}">Vote again?a>

刷新结果界面,如下:

15.视图升级,引进通用模板

from django.views import generic

class IndexView(generic.ListView):
    template_name='polls/index.html'
    context_object_name='lastest_question_list'

    def get_queryset(self):
        return Question.objects.order_by('-pub_date')[:5]

class DetailView(generic.DetailView):
    model= Question
    template_name='polls/detail.html'

class ResultsView(generic.DetailView):
    model=Question
    template_name='polls/results.html'

修改对应的路由:

urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('/',views.DetailView.as_view(),name='detail'),
    path('/results/',views.ResultsView.as_view(),name='results'),
    path('/vote/',views.vote,name='vote'),
]

16.添加测试功能

在tests.py中添加如下代码:

from django.test import TestCase

# Create your tests here.
import datetime

from django.test import TestCase
from django.utils import timezone

from .models import Question

class QuestionModelTests(TestCase):
    def test_was_published_recently_with_future_question(self):
        time = timezone.now()+datetime.timedelta(days=30)
        future_question =Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(),False)
    

用py manage.py test polls 进行测试

 这个是测试结果。是错误的。修改models.py的Question的 was_published_recently的方法:

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
        

再测试就OK了