Django的搭建

自己使用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则不会自动加/,会报错
6.urls.py文件的配置,在浏览器中输入url请求,请求会首先通过此urls.py过滤
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
]
7.配置app下的配置文件admin.py
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)

8.配置models.py文件,此文件是配置模型使用的,每次改变了此文件都需要在控制台输入:python manage.py makemigrations  和python manage.py migrate命令来使得项目知道我们的模型改变了,并应用这些改变,新改变的模型会记录到app目录下的migrations文件夹里,因此你可以通过migrations文件夹下的数据回复成以前的models版本。
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表示
9.app-myblogs下的urls.py配置,此文件的功能和第6步中提到的urls.py的文件作用一样,都是将请求的url与相应的方法做映射。
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
10.配置views.py此配置文件的作用是定义第9步中的方法
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("缂栧彿 |&nbspTITLE
") ## 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)







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值