自己使用django搭建了一个博客,在这里总结搭建的过程,和其中获得的一些经验
废话不多说,我们就来看看我是一步一步怎么走过来的吧
我们来看看整个项目的结构
1.我们需要下载Django,在cmd控制台中切换到python的安装目录下的scripts目录下执行命令:python -m pip install django,安装好了之后我们就可以看看安装的django的版本了,查看命令就是:python -m django --version
小编的版本是1.11.4的
接下来我们来开始我们的项目:
2.创建一个名为firstapp的项目:
django-admin startproject firstapp
创建好之后项目firstapp文件夹下有一个同样的名为firstapp的文件夹,此文件夹下放置的是项目的一些管理文件。
这四个文件的名称及作用是:__init__.py让python把该目录当成一个开发包(即一组模块)所需要的文件、manage.py一种命令行工具,让你可以以多种方式和django进行交互、settings.py是django项目配置和设置、urls.py该项目的url声明,即django所支撑站点的内容列表、wsig.py此文件是关于创建工程后的解析设置。
3.启动项目
运行cmd切换到项目firstapp下,注意不是项目firstapp项目的firstapp文件夹下,执行命令:python manage.py runserver
启动成功并且给出了访问地址和端口号,同样我们也可以自己定义端口号。命令:python manage.py runserver 端口号
这里有的小伙伴可能用自定义的端口进行访问的时候会遇到错误,这是因为在firstapp文件夹下的settings.py文件中设置了IP访问控制,解决方法:将settings.py中的ALLOWED_HOSTS=['*']就可以了.
4.在项目下建立一个app,名字为myblogs
python manage.py startapp myblogs
到这里我们的博客就已经建立好了,下面来配置各种配置文件,编写html文件
5.从项目firstapp的目录下的配置文件开始,也就是app——myblogs的上级目录,settings.文件配置如下,该配置文件管理着项目先的app
"""
Django settings for firstapp project.
Generated by 'django-admin startproject' using Django 1.11.4.
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
#os.path.abspath(__file__)获取当前脚本的绝对路径,os.path.dirname获取完整路径名
#两个重叠表示从尾部去掉一个文件夹,三个重叠表示去掉尾部两个文件夹,以此类推,——file——文件代表的是当前脚本
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/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '3920!@w@)4pte%g6_)lwed^uu5zh2bkwf2!8f7*fwy#(^w759z'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True #调试模式
ALLOWED_HOSTS = ['*'] #允许哪些url进行访问
# Application definition 注册的app
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myblogs.apps.MyblogsConfig',
'bootstrap3',
]
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 = 'firstapp.urls'
#模板的存放位置‘DIRS:’[BASE_DIR+'/templates',]其中BASE_IDR在文件开头有定义表示项目firstapp目录下
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR+'/firstapp/templates',],
'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 = 'firstapp.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
#数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'myblogs.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_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/1.11/topics/i18n/
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
#os.path.join(a,b)将a和b连接成一个地址a/b
STATIC_URL = '/staticx/'
STATICFILES_DIRS=[
os.path.join(BASE_DIR,'myblogs/static'),
]
MEDIA_URL = 'mediaa/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#os.pth.join(BASE_DIR,‘media’)media前面不用/是因为调用了os.path.join方法自动添加
#/,而采用BASE__DIR+media则不会自动加/,会报错
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls), #正则表达式通过开头为admin的url,admin.site.urls表示对应处理这个请求的方法
url(r'^myblogs/',include('myblogs.urls')), #通过开头为myblogs的url,include('myblogs.urls')表示用myblogs app下的urls地址映射再次匹配,因为这里已经过滤掉请求url中myblogs,在myblogs.urls中匹配是从请求url中去掉第一个的myblogs在开始匹配
url(r'^$',include('myblogs.urls')), #通过开头为空的url
]
from django.contrib import admin
from .models import Post,IMG
# Register your models here.
#admin.site.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title','slug','pub_date')#管理post的对象显示的属性,列显示
fieldsets=(
['Main',{'fields':('title','slug'),}],
['Advance',{'classes':('collapse',),'fields':('pub_date',),}])#,编辑栏的显示级分为main和advance两个模块,fields编辑项目中只显示title和slug。classes表示所使用的css
search_fields=('slug','title')#添加一个搜索框,能搜索对象的slug和title中的内容
class IMGAdmin(admin.ModelAdmin):
list_display = ('img','typekind')
list_per_page=3#每页显示三条数据
list_filter=['typekind']
fields=['img','typekind']
admin.site.register(Post,PostAdmin)s#使上面的配置生效
admin.site.register(IMG,IMGAdmin)
from django.db import models
# Create your models here.
class Post(models.Model):
title=models.CharField(max_length=200)
slug=models.CharField(max_length=200)
body=models.TextField()
pub_date=models.DateTimeField('date blogs')
class Meta:
ordering=('pub_date',)#按照时间发布排序
def _str_(self):
return self.title
class IMG(models.Model):
img = models.ImageField(verbose_name='图片',upload_to='upload')#verbose_name表示对象的中文名称,定义了就显示‘图片’而不是img
typekind=models.CharField(verbose_name='类型',max_length=200,default='',null=True,blank=True)#设置了默认值为空,blank=True允许为空,null=True表示当为空时以null表示
from django.conf.urls import url
from . import views
from django.conf import settings
from django.conf.urls.static import static
#正则表示式匹配url
urlpatterns=[
url(r'^$',views.index,name='index'),
url(r'^post/(\w+)/$',views.show_post,name='show_post'),
url(r'^upload', views.uploadImg),
url(r'^show', views.showImg),
url(r'^picture', views.showImg),
] +static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
#static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)将静态文件的地址加到urlpatterns后面
#url中接受四个参数依次分别是1、regex正则表达式,2、view用于执行正则表达式匹配的url,3kwargs
#视图使用的字典类型参数,4name:用来反向获取url
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from .models import Post
from datetime import datetime
from django.template.loader import get_template
from .models import IMG
#def index(request):
# return HttpResponse("Hello,world,you're in the blogs index")
##def index(request):
## posts=Post.objects.all()
## post_lists=[]
## post_lists.append("缂栧彿 | TITLE
")
## for count,post in enumerate(posts,1):
## post_lists.append("NO.{}:".format(str(count))+str(post.title)+"
")
## return HttpResponse(post_lists)
def index(request):
posts=Post.objects.all()#objects是模型管理器,这里是获取Post模型的中的所有记录相当一select * from Post
now=datetime.now()
template=get_template('myblogs/index.html')#获取模板
html=template.render(locals())#locals表示当前方法中的所有变量的集合
return HttpResponse(html)
def show_post(request,slug):
template=get_template('myblogs/post.html')
try:
post=Post.objects.get(slug=slug)#get相当于 where slug=slug
if post!=None:
html=template.render(locals())
return HttpResponse(html)
except:
return HttpResponseRedirect('/myblogs/')
def uploadImg(request):
if request.method == 'POST':
new_img = IMG(
img=request.FILES.get('img')
)
new_img.save()
return render(request, 'myblogs/uploadimg.html')
def showImg(request):
imgs = IMG.objects.all()
content = {
'imgs':imgs,
}
return render(request, 'myblogs/showimg.html', content)