Django开发综述1

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上传和下载文件等其他基础内容。








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值