最近两天下了班,没事学习了django的开发,今天作个总结。其实你们能够从百度,google搜到一些django的入门视频,初步了解一下django的框架。学习一些基础的概念和知识。本篇主要是对本身这两天作的作个总结。html
1.建立第一个views.pypython
上一篇文章咱们在windows上搭建好了django的开发环境并创建一个测试demo。数据库
在settings.py的同级目录下新建views.py目录。并输入如下代码django
from django.http import HttpResponse def index(req): context="This is main page!!!" return HttpResponse(context)
在urls.py 安装以下更改windows
urlpatterns = patterns('', # Examples: # url(r'^$', 'drophome.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), url(r'^index/','drophome.view.index'),
这时在浏览器里打开127.0.0.1:8000/index 就能够看到咱们第一个view啦。在django的开发中咱们主要采用mvc的模式即Models,view和control。可是这里的views.py更像control。在urls.py中是经过指定的url的对应view的index的函数。在urls.py 中指定的url是采用python中的正规表达式的形式,方便扩展。浏览器
2.利用Templates模板来格式化显示mvc
在建立一个view.py后咱们是HttpResponse来直接输出字符串的,若是想要输出更多,更复杂的内容就会很麻烦,要在代码写一些无关的html的标签。为此django提供了templats模板的概念,以下是一个模板的样本app
<html> <head> <title></title> </head> <body> <h1>{{context}}</h1> <table> {% for k,v in items %} <tr> <td> {{k}} </td> <td> {{ v}} </td> </tr> {% endfor %} </table> </body> </html>
能够保存为index.html从文件结构上和标准的html文档没什么差异。可是多了{{context}},和{% for .. %} 的东西。框架
期中{{ xxxx }} 表示为template的变量,因此的变量都是用{{ }} 来比标示,{% for k,v in items %} 是嵌入式的python的语句。用{% xxx %} 能够嵌入式python的语句。支持for,if,等python语句。那若是在view中使用template中呢。 函数
from django.shortcuts import render_to_response def display_meta(req): values=req.META.items() values.sort() return render_to_response("index.html",{"items":values},)
其实{{context}}咱们没有给他传值,所以它不会显示,也不会报错。咱们把从req获取的meta数据传给了items让他在index里面显示。
要使用template还要在settings里添加以下代码
TEMPLATE_DIRS=(os.path.join(BASE_DIR,"templates"),)
并在该项目的同级目录建立tempaltes的目录,存放index.html 模板文件。
3.Django的form的使用
在django中使用表单有两种方式:1.使用template用html定义form。2.使用django的forms类来建立模板。两种建立模板的方式都是简单方便。
首先使用template的方式建立form
<html> <head> <title>Contact us</title> </head> <body> <h1>Contact us</h1> {% if errors %} <ul> {% for error in errors %} <li>{{ error }}</li> {% endfor %} </ul> {% endif %} <form action="/contact/" method="post"> <p>Subject: <input type="text" name="subject"></p> <p>Your e-mail (optional): <input type="text" name="email"></p> <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p> <input type="submit" value="Submit"> </form> </body> </html>
在以上的html的中用html的form标签作了一个form,我咱们看看若是在view处理这个form。
def contact2(request): errors = [] if request.method == 'POST': if not request.POST.get('subject', ''): errors.append('Enter a subject.') if not request.POST.get('message', ''): errors.append('Enter a message.') if request.POST.get('email') and '@' not in request.POST['email']: errors.append('Enter a valid e-mail address.') if not errors: # send_mail( # request.POST['subject'], # request.POST['message'], # request.POST.get('email', 'noreply@example.com'), # ['siteowner@example.com'], # ) return HttpResponseRedirect('/contact/thanks/') return render_to_response('contact_form.html', {'errors': errors})
在view中能够直接经过request.POST.get('subject','')方式来获取form里面的value。
用Django的form类来建立表单,在django提供了form类,实现方式和model的相似。
from django import forms class ContactForm (forms.Form): subject=forms.CharField(max_length=32) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea) def clean_message(self): msg=self.cleaned_data['message'] num_rows=len(msg.split()) if num_rows<2: raise forms.ValidationError("Not enough words!") return msg
以上就是经过继承forms.Form 实现form。咱们能够经过实现clean_filed 的形式针对每一个字段作自定义校验。也能够设置每一个字段的属性。例如
message = forms.CharField(widget=forms.Textarea)
在view中若是使用这个表单。
def contact(request): if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data # send_mail( # cd['subject'], # cd['message'], # cd.get('email', 'noreply@example.com'), # ['siteowner@example.com'], # ) return HttpResponseRedirect('/contact/thanks/') else: form = ContactForm( initial= {'subject':'I love this site'}) return render_to_response('contact2.html', {'form': form})
也能够在view中初始化form。
看看template的html的展现时如何使用form
<html> <head> <title>Contact us</title> </head> <body> <h1>Contact us</h1> {% if form.errors %} <p style="color: red;"> Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <table> {{ form.as_table }} </table> <input type="submit" value="Submit"> </form> </body> </html>
到此为止咱们就了解了在django使用表单的方式。
4.在Django中创建models
在django中提供建模的models类。咱们能够经过继承该类既能够实现建立一个表。
对象-关系映射(OBJECT/RELATION MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据没法直接表达多对多关联和继承关系。所以,对象-关系映射(ORM)系统通常以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
上面这段是引资百度百科,帮助咱们理解这个模型。
from django.db import models from django.contrib.auth.models import User import django.forms as forms # Create your models here. class SBook (models.Model): auth= models.ForeignKey(User) account= models.CharField(max_length=256) passwd = models.CharField(max_length=32,) title = models.CharField(max_length=256) icon = models.CharField(max_length=128) url = models.CharField(max_length=128) def __unicode__(self): return self.account
咱们能够在terminal中对model能够作测试操做。此时可使用Pycharm 自带的terminal便可。
1.建立SBook的instance。
n [4]: from django.contrib.auth.models import User In [5]: user=User.objects.create(username="xcy2",password="123",email="xcy@123.com") In [6]: User.objects.all() Out[6]: [<User: xcy>, <User: xcy1>, <User: xcy4>, <User: xcy2>] In [9]: sbook=SBook.objects.create(auth=user,account="xcy2011sky",passwd="xcy.123",title="baidu.com",) In [10]: SBook.objects.all() Out[10]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]
咱们要建立SBook的实例,必须先建立user的实例,由于SBook 以来user。也能够用如下的方式建立
In [11]: sbook=SBook(auth=user,account='alan',passwd='123',title='csdn') In [12]: sbook.save() In [13]: SBook.objects.all() Out[13]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>]
2.修改更新数据:
In [14]: sbook.title='google' In [15]: sbook.save() In [16]: SBook.objects.all() Out[16]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>] In [17]: print sbook.title google
3.删除一个sbook的。
Out[28]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>] In [29]: print sbook.account alan In [30]: sbook.delete() In [31]: sbook.save() In [34]: SBook.objects.all() Out[34]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]
4.查询获取结果
In [34]: SBook.objects.all() Out[34]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>] In [35]: queryset=SBook.objects.all() In [37]: for q in queryset : ....: print q.account ....: xcy2011sky xcy2011sk abcde xcy2011sky