入门django———搭建第一个django的网站

背景

最近一直在学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.py

from 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.text

class 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 = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_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/#databases

DATABASES = {
    '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-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/2.2/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_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 Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
    https://docs.djangoproject.com/en/2.2/topics/http/urls/
Examples:
Function views
    1. Add an import:  from my_app import views
    2. Add a URL to urlpatterns:  path('', views.home, name='home')
Class-based views
    1. Add an import:  from other_app.views import Home
    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')
Including another URLconf
    1. Import the include() function: from django.urls import include, path
    2. 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,url

urlpatterns = [
    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_path

app_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.py

from 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我就希望工作后能早点到达街薪。如果你在搭建的时候遇到什么问题的话可以评论留言,我看到会及时回复的。同时也希望能有机器学习,深度学习,数据分析这方面的大佬能指导一下我,该怎么学才能最好的去适应市场需求,能少走点弯路。当然考研还是第一步,没有研究生文凭感觉在人工智能方面面试会被直接刷掉,现实还是很残忍,无奈脸。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shelgi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值