背景
最近一直在学Java,每天和各种对象打交道。当够了’渣男’突然想起来好久没有写python了,毕竟python才是我的最爱。另外最近也在搭建ubuntu的caffe+tensorflow+digits环境,老师也让我们自己学学flask和django。说实话digits真的不好搭,ubuntu上光nvidia驱动这一块就够让人头疼的了,实在想骂人的时候就动手写了一个基本的django网站,大概花费两个小时左右吧,可以当放松,另外书上代码有问题的地方我也会改正,最后成功完成了。
先上个成果图
现在开始搭建
我的环境是win10+python3.7+django2.2.3(关于看django版本后面会讲)
1.虚拟环境的建立和准备工作
首先新创建一个文件夹,命名为learning_log。
打开cmd用cd切换到这个目录。
#切换成功后在cmd中使用下面命令创建名为ll_env的虚拟环境
python -m venv ll_env
#激活ll_env这个虚拟环境
ll_env\Scripts\activate#激活后安装Django
pip install Django#查看安装的Django版本
python -m django --version
#显示的就是django的版本啦
注意,使用的是虚拟环境的话前面会有(ll_env)这个显示的,不然就是没有激活虚拟环境。
2.创建项目
首先新建一个项目
django-admin.py startproject learning_log .
#注意后面的结束点一定要写上,这样才能使项目有合适的目录结构
#用dir查看一下目录结构或者自己打开文件夹查看,应该是有ll_env,manage.py和learning_log三个文件
#再看看learning_log的内容
dir learning_log
#应该是__init__.py,setting.py,urls.py和wsgi.py四个.py文件
因为我的已经做好了,目录里面多了很多东西所以这里就不展示了
创建数据库
同样在激活的虚拟环境下,用下面的命令
python manage.py migrate
然后会发现learning_log中多了一个db.sqlite3文件,这个就是数据库了。
检查项目是否成功创建
#还是在激活的虚拟环境下输入
python manage.py runserver
打开浏览器,输入网址localhost:8000应该可以看到django的欢迎界面,如下
想要停止服务,还是在cmd中按住ctrl+c就好啦
到此,确保一切正常后就可以开始写我们自己的内容了
3.创建应用程序和网页
ctrl+c停止掉服务后,在cmd中开始创建自己的app
python manage.py startapp learing_logs
#注意,我这里是learing_logs,书中原本是learning_logs,我是为了自己好区分点就在前面少了n。如果按书上来的话,在我后面的代码中对应地方把n加上就好了。
创建learning_logs成功后打开其中的models.py
#learing_logs下的models.pyfrom django.db import models
# Create your models here.
class Topic(models.Model):"""用户学习的主题"""text=models.CharField(max_length=200)#max_length:设置主题名的长度date_added=models.DateTimeField(auto_now_add=True)#True的作用:每当创建新的主题时自动设置当前的日期和时间def __str__(self):"""返回模型的字符串表示"""return self.textclass Entry(models.Model):"""学到的有关某个主题的具体知识"""topic=models.ForeignKey(Topic,on_delete=models.CASCADE)#书中原码没有on_delete=models.CASCADE,但是Django2.X需要这个,否则会报错text=models.TextField()date_added=models.DateTimeField(auto_now_add=True)class Meta:verbose_name_plural='entries'def __str__(self):"""返回模型的字符串表示"""return self.text[:50]+"..."
激活这个模型
编辑setting.py文件
#/learning_log/learning_log下的setting.py
"""
Django settings for learning_log project.Generated by 'django-admin startproject' using Django 2.2.3.For more information on this file, see
https://docs.djangoproject.com/en/2.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/
"""import os# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'raeaahi)wo(*d99e+a!dfc+p5qbnt#ew9*r_k(hmbj$vhc!6$x'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
#在这里添加下面两行#我的应用程序'learing_logs',
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]ROOT_URLCONF = 'learning_log.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'learning_log.wsgi.application'# Database
# https://docs.djangoproject.com/en/2.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR, 'db.sqlite3'),}
}# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_L10N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/STATIC_URL = '/static/'
修改数据库,存储迁移自己定义的模型
记住,每次定义了新的模型后都要做这一步
#在cmd中输入
python manage.py makemigrations learing_logs
python manage.py migrate
获取超级用户权限
python manage.py createsuperuser
这里面的username随意填一个就好,邮箱可以不填,密码要填且自己要记住,后面登陆时会用到。
模型的注册
打开admin.py
#learing_logs下的admin.py
from django.contrib import admin# Register your models here.
from learing_logs.models import Topic,Entry
admin.site.register(Topic)
admin.site.register(Entry)
这个时候运行项目,还是python manage.py runserver
打开localhost:8000/admin
点击add添加Topic和Entries的内容(随意就好)
记得要save哦
最后,创建主页,映射和其他网页
快完成了有点小激动,不多废话直接上代码
#/learning_log/learning_log下的urls.py"""learning_log URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see:https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views1. Add an import: from my_app import views2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views1. Add an import: from other_app.views import Home2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf1. Import the include() function: from django.urls import include, path2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path
from django.conf.urls import include,urlurlpatterns = [path('admin/', admin.site.urls),path(r'',include(('learing_logs.urls','learing_logs'), namespace='learing_logs')),"""这里书上用的都是url(),但是Django2.X开始都用path()代替了,还有include()里面的参数问题,一开始就是这里出错,纠结了好一会看了相关的文档才解决,目前上面这个代码是正确的"""
]
在learing_logs下新建一个urls.py文件
#learing_logs下的urls.py"""定义learing_logs的url模式"""
from django.conf.urls import url
from . import views
from django.urls import path,re_pathapp_name='learing_logs'urlpatterns=[
"""下面用#的都是path()的代码,但是不知道为什么有的运行会出错,
特别是topic_id匹配那一块,一开始匹配不到,后来试了很多最后才成功,
没注释的代码我运行是成功的,如果不成功可以试试更换一下注释的代码。
至于为什么url跳转的时候匹配错误我也没搞清楚,尴尬了"""#主页url(r'^$',views.index,name='index'),#path('',views.index,name='index'),#特定主题的详情页面#re_path('topics/(?P<topic_id>\d+)/',views.topic,name='topic'),url(r'^topics/(?P<topic_id>\d+)/$',views.topic,name='topic'),#path('topics/(?P<topic_id>\d+)/', views.topic, name='topic'),#显示所有主题url(r'^topics/$',views.topics,name='topics'),#path('topics',views.topics,name='topics'),
]
编写视图views.py
#learing_logs下的views.pyfrom django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):"""学习笔记的主页"""return render(request,'learing_logs/index.html')def topics(request):"""显示所有主题"""topics=Topic.objects.order_by('date_added')context={'topics':topics}return render(request,'learing_logs/topics.html',context)def topic(request, topic_id):"""显示单个主题及其所有的条目"""topic=Topic.objects.get(id=topic_id)entries=topic.entry_set.order_by('-date_added')context={'topic':topic,'entries':entries}return render(request,'learing_logs/topic.html',context)
最后就是各种模板html文件了
在learing_logs下新建templates文件夹,再在里面新建learing_logs文件夹保存各种html文件,一共有四个分别是base.html,index.html,topic.html和topics.html
下面是html文件的代码
index.html
{% extends "learing_logs/base.html" %} {% block content %}
<p>Learning Log helps you keep track of learning,for any topic you're learning about.</p>
{% endblock content %}
base.html
<p><a href="{% url 'learing_logs:index' %}">Learning Log</a> -<a href="{% url 'learing_logs:topics' %}">Topics</a>
</p>
{% block content %} {% endblock content %}
topic.html
{% extends 'learing_logs/base.html' %} {% block content %}<p>Topic:{{ topic }}</p>
<p>Entries:</p>
<ul>{% for entry in entries %}<li><p>{{ entry.date_added|date:'M d,Y H:i' }}</p><p>{{ entry.text|linebreaks }}</p></li>{% empty %}<li>There are no entries for this topic yet.</li>{% endfor %}
</ul>{% endblock content %}
topics.html
{% extends "learing_logs/base.html" %} {% block content %}
<p>Topics</p><ul>{% for topic in topics %}<li><a href="{% url 'learing_logs:topic' topic.id %}">{{ topic }}</a></li>{% empty %}<li>No topics have been added yet.</li>{% endfor %}
</ul>{% endblock content %}
全部保存后直接python manage.py runserver启动服务
打开网页localhost:8000/topics,就可以看到之前一开始我的成果图了
点击Learning_Log可以跳转到首页(localhost:8000)
4.结束
写完这个又要回Ubuntu上面搭建digits了。就像我说的,希望每天可以强一点点,忙碌起来才能忘掉很多烦恼,也希望作为程序猿的大家也可以慢慢实现自己的梦想,作为一个七年的虎扑JR我就希望工作后能早点到达街薪。如果你在搭建的时候遇到什么问题的话可以评论留言,我看到会及时回复的。同时也希望能有机器学习,深度学习,数据分析这方面的大佬能指导一下我,该怎么学才能最好的去适应市场需求,能少走点弯路。当然考研还是第一步,没有研究生文凭感觉在人工智能方面面试会被直接刷掉,现实还是很残忍,无奈脸。