Django是一个基于Python的网站开发框架。
set.py文件中主要对整个网站进行配置:INSTALLED_APPS里记录了网站开发用到的插件;如果用到了上传文件的功能,必须加上MEDIA_ROOT和MEDIA_URL两项admin才能运行;MIDDLEWARE_CLASSES记录了整个网站运行需要的中间层,比如要避免csrf攻击的警告就要加入django.middleware.csrf.CsrfViewMiddleware这个类。一般建立网站都要new几个新的app放在INSTALLED_APPS中,另外向south这样的数据库迁移插件等也必须加入到这里面。
网站名文件夹下的urls.py记录了网页地址与对应行为的关联,一部会有url(r'^admin/', include(admin.site.urls))这一条来关联admin,还会加入如下:
urlpatterns +=patterns((''),
(r'^meeting/',include('meeting.urls')),
)
的命令,意思是把meeting开头的url都交给meeting这个app下的urls.py来处理。
meeting下的urls.py则有如下代码
urlpatterns=patterns(('meeting.views'),
url(r'^meetinglist/$','meeting_list',name='meetinglist'),
url(r'^userlist/$','user_list',name='userlist'),
url(r'^roomlist/$','room_list',name='roomlist'),
url(r'^addmeeting/$','add_meeting',name='addmeeting'),
url(r'^addmeetingact/$','add_meeting_act',name='addmeeting_act'),
url(r'^addroom/$','add_room',name='addroom'),
url(r'^addroomact/$','add_room_act',name='addroom_act'),
url(r'^addfile/$','add_file',name='addflie'),
url(r'^downloadfile/$','download_file',name='downloadflie'),
)
就代表了/meeting/**与meeting下的views.py文件的**函数相关连(就是进入这个网页时自动执行views.py的对应函数)。
views.py需要管理整个网站的逻辑并且与html文件和数据库相关联。比如
def add_meeting(request)
rooms=Room.objects.all()
reporters=User.objects.all()
files=File.objects.all()
dic={"rooms":rooms,"reporters":reporters,"files":files}
return render_to_response("add_meeting.html",dic)
中Room就是一个数据库类,它写在models.py中写的方式如下
class Room(models.Model):
room_id=models.CharField(max_length=10)
name=models.CharField(max_length=10)
def __unicode__(self):
return self.name
Charield这是Django定应的数据结构,对应于数据库中的varchar类型,执行python manage.py sqlall [appname]后,Django自动把对应app中models的python代码翻译成对应数据库的sql语句,然后执行pythin manage.py syncdb后。在数据库中建立models中定义的表。表建立之后,如果models中的表在编写过程中改变了,用pythin manage.py syncdb就无效了,此时需要使用south这个数据库迁移插件来改变数据库,使用方法在这个网址里。另外,建立好表之后,需要在admin中注册这些表才能通过admin直接对表进行增删改查。
在view中对数据库的操作一般通过数据库表的对象进行,比如Room.objects.all()返回表中所有数据,Room.objects.get()则能执行select语句的作用。
当我们在数据库中检索出符合条件的信息后,我们要类似return render_to_response("[网址]","rooms":rooms)这样的语句来传递信息到html文件中。其中没有引号的是函数里的变量,带引号的是html中的变量。如果要传递多组这样的参数到html中,则需要以字典的方式来传送。html文件如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>
会议室管理系统
</title>
</head>
<a href="/meeting/meetinglist">
会议信息
</a>
<a href="/meeting/roomlist">
会议室信息
</a>
<a href="/meeting/userlist">
人员信息
</a>
<body>
<h1>会议室管理系统 </h1>
{% block content %}
{% endblock %}
{% block footer %}
{# 任何每个页面都可能修改的文本区域的页脚 #}
<p>Thanks for visiting my site! </p>
{% endblock %}
</body>
</html>
文件中的{%%}内的信息都会被view函数中传递来的参数替换(前提是名字一样)。而且在html里还可以写类似循环和判断的结构,这个是Django的特点之一。
利用这个特点,我们能在html中不借助其他工具,直接得到数据库的内容,比如如果我们想做一个select框,框的内容要从数据库里得到,可以这么做
会议报告人<select name="reporter">
<option selected>=选择会议报告人=</option>
{% for reporter in reporters %}
<option value="{{ reporter.name }}">{{ reporter.name }}</option>
{% endfor %}
</select>
介绍了view向html传递数据,还得介绍html向view传递数据。传递主要通过form表单提交的方式完成
<form action="/meeting/downloadfile/" method="post">
文件名称<select name="filesname">
<option selected>=选择文件名=</option>
{% for file in files %}
<option value="{{ file.filesname }}">{{ file.filesname }}</option>
{% endfor %}
</select>
<input type="submit" value="下载文件">
</form>
form表单的action关联到一个网页,然后这个网页又关联到view中的一个函数,而网页中的信息可以通过POST方法,传递到函数中去
@csrf_exempt
def add_room_act(request):
flag=0
errors = []
if request.method == 'POST':
if not request.POST.get('room_id', ''):
errors.append('Enter a room_id.')
else:
flag=flag+1
if not request.POST.get('name', ''):
errors.append('Enter a name.')
else:
flag=flag+1
if flag==2:
r=Room(room_id=request.POST.get('room_id'),name=request.POST.get('name'))
r.save()
errors.append('OK')
return render_to_response("error_list.html",{"errors":errors},context_instance=RequestContext(request))
request.POST.get('name','')里面的name要对应form表单中输入框的名称。
当然,对应于这种request直接获取的方式,使用Django的form类来获取这些数据会更加简洁、优雅。
@csrf_exempt
def add_file(request):
errors=[]
if request.method=='POST':
form=filesform(request.POST,request.FILES)
if form.is_valid():
m_f=File()
m_f.filesname=form.cleaned_data['filesname']
m_f.creation_date=datetime.today()
m_f.files=form.cleaned_data['files']
m_f.save()
errors.append('file ok')
else:
errors.append('file transportation failed')
return render_to_response("error_list.html",{"errors":errors},context_instance=RequestContext(request))
下一篇将讲述Django的Template、如何使用Django上传和下载文件等其他基础内容。