环境准备

1、    创建一个Django后,Django的目录:

  1. manage.py

  2. ├─Django_s1
  3. settings.py
  4. urls.py
  5. wsgi.py
  6. __init__.py

  7. templates

创建app,通过命令:

python manage.py startapp app01

创建app之后的目录结构如下:

  1. manage.py

  2. ├─app01
  3. admin.py
  4. apps.py
  5. models.py
  6. tests.py
  7. views.py
  8. __init__.py

  9. └─migrations
  10. __init__.py

  11. ├─Django_s1
  12. settings.py
  13. urls.py
  14. wsgi.py
  15. __init__.py


  16. └─templates

2、    创建一个项目之后首先需要做的配置

Django_s1目录下settings.py文件中需要做如下配置:

  • 找到MIDDLEWARE部分,将第四行内容注释掉:

'django.middleware.csrf.CsrfViewMiddleware',

  • 找到TEMPLATES部分,如果没有如下代码,则需要添加:

'DIRS': [os.path.join(BASE_DIR, 'templates')]

  • 文件的最后添加静态文件目录,需要注意的是这里是一个元组没所以后面的逗号必须添加
  1. STATICFILES_DIRS=(
  2. os.path.join(BASE_DIR,"static"),
  3. )

同时需要创建一个名字为static的文件夹,用于存放静态文件

3、    到此为止基本的配置就已经完成,最后的目录结构如下:

  1. manage.py

  2. ├─app01
  3. admin.py
  4. apps.py
  5. models.py
  6. tests.py
  7. views.py
  8. __init__.py

  9. └─migrations
  10. __init__.py

  11. ├─Django_s1
  12. settings.py
  13. urls.py
  14. wsgi.py
  15. __init__.py


  16. ├─static
  17. └─templates

4、    创建一个测试页面,验证:

  • 主要的业务代码是放在app01目录下view.py文件中,先在view.py中写如下测试代码:
  1. from django.shortcuts import HttpResponse
  2. def index(request):
  3. return HttpResponse("index")
  • 同时在url.py中添加上对应关系:
  1. from app01 import views
  2.  
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^index/', views.index),
  6. ]

登录http://127.0.0.1:8000/index/

5、    写一个简单的登录页面

这里我们需要记住:

templates目录中放的是html文件

static中放的是静态文件即css,以及js文件

views.py中写业务代码

urls.py中写路由关系

首先在templates里写login.html,代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="/login/" method="post">
  9. <p>
  10. <input type="text" name="user" placeholder="用户名">
  11. </p>
  12. <p>
  13. <input type="password" name="pwd" placeholder="密码">
  14. </p>
  15. <input type="submit" value="提交">
  16. </form>
  17. </body>
  18. </html>

在views,添加如下代码:

  1. def login(request):
  2. if request.method=="GET":
  3. return render(request,"login.html")
  4. elif request.method == "POST":
  5. u = request.POST.get("user")
  6. p = request.POST.get("pwd")
  7. if u == "zhaofan" and p == "":
  8. return redirect('/index/')
  9. else:
  10. return render(request,"login.html")
  11. else:
  12. return redirect('/index/')

在urls路由关系里添加如下代码,黄色背景部分:

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^index/', views.index),
  4. url(r'^login/', views.login),
  5. ]

这样通过浏览器访问效果如下:

关于获取数据和文件上传

实现的代码如下:

1、    在views.py里写如下函数

  1. def login(request):
  2. if request.method=="GET":
  3. return render(request,"login.html")
  4. elif request.method == "POST":
  5. # v = request.POST.get("gender")
  6. # print(v)
  7. # f = request.POST.getlist("city")
  8. # print(f)
  9. # file = request.POST.get("upload")
  10. # print(file)
  11. obj = request.FILES.get("upload")
  12. print(obj,type(obj),obj.name)
  13. import os
  14. file_path = os.path.join("upload_dir",obj.name)
  15. f = open(file_path,mode="wb")
  16. for i in obj.chunks():
  17. f.write(i)
  18. f.close()
  19. return render(request, "login.html")
  20. else:
  21. return redirect('/index/')

2、    login.html文件中代码如下;

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="/login/" method="post" enctype="multipart/form-data">
  9. <p>
  10. <input type="text" name="user" placeholder="用户名">
  11. </p>
  12. <p>
  13. <input type="password" name="pwd" placeholder="密码">
  14. </p>
  15. <p>
  16. 男:<input type="radio" name="gender" value="1">
  17. 女:<input type="radio" name="gender" value="2">
  18. </p>
  19. <p>
  20. 乒乓球:<input type="checkbox" name = "favor" value="1">
  21. 篮球:<input type="checkbox" name = "favor" value="2">
  22. 羽毛球:<input type="checkbox" name = "favor" value="3">
  23. </p>
  24. <p>
  25. <select name="city" multiple>
  26. <option value="sh">上海</option>
  27. <option value="bj">北京</option>
  28. <option value="tj">天津</option>
  29. </select>
  30. </p>
  31. <p>
  32. <input type="file" name="upload">
  33. </p>
  34. <input type="submit" value="提交">
  35. </form>
  36. </body>
  37. </html>

3、    关于上述代码中知识点的总结:

  • 当获取单个值的时候类似单选框,可以给标签设置name属性,然后通过类似request.POST.get("gender")方式获取相应的值即:

request.POST.get("标签name属性值")

  • 当获取多个值的时候类似复选框以及可以多选的select的时候,通过request.POST.getlist("city")的方式获取相应的内容,这样得到的是一个列表,即:

request.POST.getlist("标签name属性值")

  • 当时获取上传文件的时候

首先form表单中应该有如下属性:enctype="multipart/form-data"

然后在views.py中通过obj = request.FILES.get("upload")获取文件的一个对象,通过打印可以看出这个对象的详细内容为:<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>即:

request.FILES.get("标签name属性值")

最后通过如下方式循环将文件接收:

  1. import os
  2. file_path = os.path.join("upload_dir",obj.name)
  3. f = open(file_path,mode="wb")
  4. for i in obj.chunks():
  5. f.write(i)
  6. f.close()

这样最后所有的上传文件都会放在upload_dir目录下,当然这个目录需要自己提前创建

关于FBV和CBV

1、    FBV

FBV对应的是function base view

urls.py

index--->函数名

views.py

def 函数(request)

2、    CBV

CBV对应的是class base view

3、    之前写的都是FBV的方式多点,下面通过一个CBV的例子来理解CBV

  • 首先先写一个home.html文件,代码如下:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <form action="/home/" method="post">
  9. <input type="text" name="user">
  10. <input type="submit">
  11. </form>
  12. </body>
  13. </html>
  • views.py中写如下代码:
  1. from django.views import View
  2. # 这里Home需要继承View
  3. class Home(View):
  4. def get(self,request):
  5. print(request.method)
  6. return render(request,"home.html")
  7. def post(self,request):
  8. print(request.method)
  9. return render(request, "home.html")
  • urls.py中写如下代码高亮部分:
  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^index/', views.index),
  4. url(r'^login/', views.login),
  5. url(r'^home/', views.Home.as_view()),
  6.  
  7. ]
  • 效果如下

当访问页面内容时:

查看django打印的日志可以看出都是的get请求:

当点击提交的时候:查看django的日志可以看出是post请求;

4、    关于CBV,django在内部是如何实现的?

分析:

当访问页面的时候:头部中请求的方法是GET方式:

当点击提交的时候:头部中的请求的方法是POST方式:

其实当发送请求的时候,是将Request URL以及Request Method同时传递给django,先匹配url,然后去找对应的类,然后找相应的方法,也就是post或者get等,这里判断是post还是get是通过反射实现的。

查看view类里面有一个函数:dispatch函数

  1. def dispatch(self, request, *args, **kwargs):
  2. # Try to dispatch to the right method; if a method doesn't exist,
  3. # defer to the error handler. Also defer to the error handler if the
  4. # request method isn't on the approved list.
  5. if request.method.lower() in self.http_method_names:
  6. handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
  7. else:
  8. handler = self.http_method_not_allowed
  9. return handler(request, *args, **kwargs)

从函数可以看出是dispatch先做了一个反射的功能

所以这个请求的过程是:请求--->dispatch--->get/post

将views.py中的代码更改为如下:

  1. from django.views import View
  2. # 这里Home需要继承View
  3. class Home(View):
  4. # 这样这里就相当于一个装饰器的功能,可以自己定制化内容
  5. def dispatch(self, request, *args, **kwargs):
  6. # 调用父类中dispatch方法
  7. print("before")
  8. result = super(Home, self).dispatch(request,*args,**kwargs)
  9. print("after")
  10. return result
  11. def get(self,request):
  12. print(request.method)
  13. return render(request,"home.html")
  14. def post(self,request):
  15. print(request.method)
  16. return render(request, "home.html")

这样从效果就可以看出当再次访问home页面的时候,每次都需要打印before以及after

5、    模板语言中字典的循环

views.py中写如下代码:

  1. USER_DICT = {
  2. "k1":"root1",
  3. "k2":"root2",
  4. "k3":"root3",
  5. "k4":"root4",
  6. "k5":"root5",
  7. }
  8.  
  9. def index(request):
  10. return render(request,"index.html",{"user_dict":USER_DICT})

创建一个index.html文件,代码如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. {% for k,row in user_dict.items %}
  10. <li>{{ k }}-{{ row }}</li>
  11. {% endfor %}
  12. </ul>
  13. </body>
  14. </html>

按照上面的循环方式结果如下:

同样的字典循环包含以下几种方式:

user_dict.items ---- 这样循环row为(k,value)

user_dict.values ---- 这样循环row为value值

user_dict ----这样循环的话row为k值

关于URL路由系统

1、    实现一个点击查看详情的例子(方法一)

views.py中的代码如下;

  1. USER_DICT = {
  2. "k1":{"name":"root1","email":"root1@qq.com"},
  3. "k2":{"name":"root2","email":"root2@qq.com"},
  4. "k3":{"name":"root3","email":"root3@qq.com"},
  5. "k4":{"name":"root4","email":"root4@qq.com"},
  6.  
  7. }
  8.  
  9. def index(request):
  10. return render(request,"index.html",{"user_dict":USER_DICT})
  11.  
  12. def detail(request):
  13. nid = request.GET.get("nid")
  14. detail_info = USER_DICT[nid]
  15. return render(request,"detail.html",{"detail_info":detail_info})

index.html文件中的代码如下;

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. {% for k,row in user_dict.items %}
  10. <li><a target="_blank" href="/detail/?nid={{ k }}">{{ row.name }}</a></li>
  11. {% endfor %}
  12. </ul>
  13. </body>
  14. </html>

detail.html代码为如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <h1>详细信息</h1>
  9. <h6>用户名:{{ detail_info.name }}</h6>
  10. <h6>邮箱:{{ detail_info.email }}</h6>
  11. </body>
  12. </html>

urls.py中写如下代码高亮部分:

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^index/', views.index),
  4. url(r'^login/', views.login),
  5. url(r'^home/', views.Home.as_view()),
  6. url(r'^detail/', views.detail),
  7.  
  8. ]

实现效果为当打开index主页的时候显示:

点击某个选项,则可以显示详细信息

2、    实现一个点击查看详情的例子(方法二)

urls.py中的代码如下高亮部分;

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^index/', views.index),
  4. url(r'^login/', views.login),
  5. url(r'^home/', views.Home.as_view()),
  6. #url(r'^detail/', views.detail),
  7. url(r'^detail-(\d+).html', views.detail),
  8.  
  9. ]

views.py中的代码如下:

  1. USER_DICT = {
  2. "":{"name":"root1","email":"root1@qq.com"},
  3. "":{"name":"root2","email":"root2@qq.com"},
  4. "":{"name":"root3","email":"root3@qq.com"},
  5. "":{"name":"root4","email":"root4@qq.com"},
  6.  
  7. }
  8.  
  9. def index(request):
  10. return render(request,"index.html",{"user_dict":USER_DICT})
  11. def detail(request,nid):
  12. # return HttpResponse(nid)
  13. detail_info = USER_DICT[nid]
  14. return render(request,"detail.html",{"detail_info":detail_info})

index.html中的代码为:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. {% for k,row in user_dict.items %}
  10. <li><a target="_blank" href="/detail-{{ k }}.html">{{ row.name }}</a></li>
  11. {% endfor %}
  12. </ul>
  13. </body>
  14. </html>

detail.html中代码不变

最终的效果,点击详细页面之后,地址变为/detail-2.html而不是之前的/detail?nid-2.html:

3、    针对上述的例子,我们将urls.py进行修改:

将url(r'^detail-(\d+).html', views.detail),修改为:

url(r'^detail-(\d+)-(\d+).html', views.detail),

这样就存在两个正则,这样在views.py中获取到的时候也需要两个参数,def detail(request,nid,uid),并且这两个参数和顺序有关,第一个参数就是匹配的第一个正则,第二个匹配第二个正则,这样就会有个弊端,一旦调用函数的时候参数传递错误,那个真个函数里设计这两个参数的计算都会出现问题。

所以我们通常用如下方法:

url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),

这样就相当于分组,这样就不会应该顺序问题而影响结果

其实在views.py中有一个终极的方法:

def detail(*args,**kwargs),这样当多个参数的就会传递到*args里,当传递字典类型的参数的时候就会传递到**kwargs

4、    name

name是对URL路由关系进行命名,以后可以根据此名称生成自己想要的URL

  • url(r'^sdfffddddd/', views.index,name="i1"),
  • url(r'^sdfffddddd/(\d+)/(\d+)/', views.index,name="i2"),
  • url(r'^sdfffddddd/(?P<nid>\d+)/(?P<uid>\d+)/', views.index,name="i3"),

注意:

获取当前URL

request.path_info

如果def func(request,*args,**kwargs)

from django.urls impore reverse

url1 = reverse("i1")  ----这样就会生成/sdfffddddd/

url2 = reverse("i2",args=(1,2,)) ---生成/1/2/

url3 = reverse("i3",kwargs={"pid":1, "uid":9}) ---生成/1/9

在模板语言中:

{% url "i1" %}    ---生成/sdfffddddd/

{% url "i2" 1 2 %}  --生成/1/2/

{% url "i3" pid=1 uid=3 %} ---生成/1/3/

5、    路由分发

当有 多个app的时候

当请求来的时候先到项目的urls.py里,这里的配置如下:

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3.  
  4. urlpatterns = [
  5. url(r'^app01/',include("app01.urls")),
  6. url(r'^app02/',include("app02.urls")),
  7.  
  8. ]

根据不同的app去不同的app下找相应的app级别的urls

这样就实现了路由的分发

Django的ORM

1、    创建类

根据类自动创建数据库表

创建类的位置是在你创建的app目录下有一个models.py,就在这个文件中创建类,写一个简单的类的例子:

  1. class UserInfo(models.Model):
  2. #django会默认创建一个id列,并且是自增,主键
  3.  
  4. #创建用户名列,字符类型,指定长度
  5. username = models.CharField(max_length=32)
  6. #c创建密码列,字符类型,指定长度
  7. password = models.CharField(max_length=64)

创建过之后执行:

python manage.py makemigrations

执行这个命令之后,Django会去找models.py文件

因为我们是在app01下的models.py,所以需要在settings.py中进行指定,找到:

  1. INSTALLED_APPS = [
  2. 'django.contrib.admin',
  3. 'django.contrib.auth',
  4. 'django.contrib.contenttypes',
  5. 'django.contrib.sessions',
  6. 'django.contrib.messages',
  7. 'django.contrib.staticfiles',
  8. ]

在最后添加"app01",

这样当执行python manage.py makemigrations,就会找到app01下的models.py从而在app01目录下的migrations目录下生成对应的文件,这个文件就是用于创建数据库表用的,执行过程如下:

  1. D:\python培训\Django_s1>python manage.py makemigrations
  2. Migrations for 'app01':
  3. app01\migrations\0001_initial.py:
  4. - Create model UserInfo
  5.  
  6. D:\python培训\Django_s1>

然后执行python manage.py migrate,这样就会在数据库中创建表结构,执行过程如下:

  1. D:\python培训\Django_s1>python manage.py migrate
  2. Operations to perform:
  3. Apply all migrations: admin, app01, auth, contenttypes, sessions
  4. Running migrations:
  5. Applying contenttypes.0001_initial... OK
  6. Applying auth.0001_initial... OK
  7. Applying admin.0001_initial... OK
  8. Applying admin.0002_logentry_remove_auto_add... OK
  9. Applying app01.0001_initial... OK
  10. Applying contenttypes.0002_remove_content_type_name... OK
  11. Applying auth.0002_alter_permission_name_max_length... OK
  12. Applying auth.0003_alter_user_email_max_length... OK
  13. Applying auth.0004_alter_user_username_opts... OK
  14. Applying auth.0005_alter_user_last_login_null... OK
  15. Applying auth.0006_require_contenttypes_0002... OK
  16. Applying auth.0007_alter_validators_add_error_messages... OK
  17. Applying auth.0008_alter_user_username_max_length... OK
  18. Applying sessions.0001_initial... OK
  19.  
  20. D:\python培训\Django_s1>

因为Django默认使用的是sqlite数据库库,所以这个时候会在项目目录下生成一个db.sqlite3的文件,如果想要查看需要第三方程序查看,如果想要用mysql数据库,则需要更改配置。

更改配置如下:

找打settings.py中的如下内容,并注释:

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.sqlite3',
  4. 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
  5. }
  6. }

添加如下内容:并配置自己的数据库信息

  1. DATABASES = {
  2. 'default': {
  3. 'ENGINE': 'django.db.backends.mysql',
  4. 'NAME':'dbname',
  5. 'USER': 'root',
  6. 'PASSWORD': 'xxx',
  7. 'HOST': '',
  8. 'PORT': '',
  9. }
  10. }

由于Django内部连接mysql用的是MySQLdb模块,而python3中已经没有了这个模块,所以需要使用pymysql来代替MySQLdb,配置如下:

在与项目同名的文件目录下的__init__.py文件中添加如下内容:

  1. import pymysql
  2. pymysql.install_as_MySQLdb()

这样重新执行python manage.py migrate即可

查看数据你会看到如下表:

其中只有一个表app01_userinfo是你自己通过类创建的其他都是django自己创建的,查看app01_userinfo表结构信息:

2、    添加数据

方法一:(推荐这种方法)

models.UserInfo.objects.create(username = "root", password = "123",)

首先在app01下的urls.py中添加如下内容:

url(r'^app02/',include("app02.urls")),

然后在views.py中添加如下内容:

  1. from app01 import models
  2. def orm(request):
  3. models.UserInfo.objects.create(
  4. username = "root",
  5. password = "",
  6. )
  7. return HttpResponse("orm is ok")

然后通过浏览器访问http://127.0.0.1:8000/app01/orm/

这样就在数据库里添加了一条数据数据

方法二:

  • obj = models.UserInfo(username="dean",password = "123456")

obj.save()

然后通过浏览器访问http://127.0.0.1:8000/app01/orm/

这样就在数据库里添加了一条数据数据

方法三:

dic={"username":"erric","password":"555"}、models.UserInfo.objects.create(**dic)

return HttpResponse("orm is ok")

然后通过浏览器访问http://127.0.0.1:8000/app01/orm/

这样就在数据库里添加了一条数据数据

3、    查询数据

查询所有数据

result = models.UserInfo.objects.all()

这样得到的result通过打印时如下:

<QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>

这个QuerySet是Django创建的一种类似列表的格式,这里面每个元素就是数据库每行的一个对象,这样我们就能通过循环获取每行的数据,方法如下:

  1. result = models.UserInfo.objects.all()
  2. print(result)
  3. for row_obj in result:
  4. print(row_obj.id,row_obj.username,row_obj.password)
  5. return HttpResponse("orm is ok")

根据条件 查询数据

result =models.UserInfo.objects.filter(username="root")

这里的filter就相当于sql语句中的where条件

4、    删除数据

models.UserInfo.objects.delete() 删除所有数据

models.UserInfo.objects.filter(id=2).delete() 通过条件删除

5、    更新数据

models.UserInfo.objects.all().update(password=222)

上面是将所有的的密码都更改,

如果想要根据条件更改则可以:

models.UserInfo.objects.filter(id=2).update(password=888)

继续Django的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. django server之间通过remote user 相互调用

    首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  8. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  9. Django

    一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...

  10. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

随机推荐

  1. 利用ipython实现多线程

    多线程来批量化处理数据的时候希望简单的应用,使用ipython会很简单 参考这里

  2. Hadoop学习笔记(1) 初识Hadoop

    1. Hadoop提供了一个可靠的共享存储和分析系统.HDFS实现存储,而MapReduce实现分析处理,这两部分是Hadoop的核心. 2. MapReduce是一个批量查询处理器,并且它能够在合理 ...

  3. <更新日期03-31-2016> 复利计算5.0 <已改进>

    作业要求: 1.客户说:帮我开发一个复利计算软件. 完成复利公式计算程序,并成功PUSH到github上. 客户提出: 2.如果按照单利计算,本息又是多少呢? 3.假如30年之后要筹措到300万元的养 ...

  4. jquery 事件冒泡的介绍以及如何阻止事件冒泡

    在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级 ...

  5. WEB容器启动——web.xml加载详解

    最近在看spring的源码,关于web.xml文件在容器(Tomcat.JBOSS等)启动时加载顺序问题很混乱,通过搜集资料,得出以下的结论: 1.加载顺序与它们在 web.xml 文件中的先后顺序无 ...

  6. 廖雪峰js教程笔记12 用DOM更新 innerHMTL 和修改css样式

    拿到一个DOM节点后,我们可以对它进行更新. 可以直接修改节点的文本,方法有两种: 一种是修改innerHTML属性,这个方式非常强大,不但可以修改一个DOM节点的文本内容,还可以直接通过HTML片段 ...

  7. CodeForces 455D 分块

    题目链接:http://codeforces.com/problemset/problem/455/D 题意:给定一个长度为n的序列a[]. m次操作.共有两种操作 1 l r:将序列的a[l].a[ ...

  8. XVI Open Cup named after E.V. Pankratiev. GP of SPB

    A. Bubbles 枚举两个点,求出垂直平分线与$x$轴的交点,答案=交点数+1. 时间复杂度$O(n^2\log n)$. #include<cstdio> #include<a ...

  9. Struts2 整合Spring(Maven,注解版)

    这两天正在试验Struts2与Spring框架的整合,和他们各自的“注解”.今天就总结一下这两个框架怎么用注解进行整合. 一,加入两者的依赖包,除了两者的必要依赖外,还需要导入struts2-spri ...

  10. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...