这几天都在写一个程序,是在一个网络公司实习的时候叫做的练习。下面我程序的全部用到的代码和命令,以及一些说明,记在这里希望自己以后看到 还有也许对某些人有用,省点力气。也欢迎提建议帮助我进步。
用python+django+sqlite3弄的
sqlite3只用了它的drop table 的命令,因为改了类的结构之后就会导致表的改变,要去数据库里面修改表,反正是练习干脆drop掉。
django-admin.py startproject new2 新建一个项目,
manage.py startapp myorder
建了一个app
然后修改settings.py
DATABASE_ENGINE = 'sqlite3' . 数据库直接下载了一个sqlite3.exe很小的文件直接使用
DATABASE_NAME = '/.data2.db' 这个data2.db的路径要写绝对路径了,我写了这个,d盘根目录下出现了个.data2.db文件 如果改了models就要在cmd里面写sqlite3 d:/.data2.db 然后写.tables 看到里面的table的名字,看了名字(我的是myorder_restitem) 然后用drop table myorder_restitem命令把关于餐馆的类的表丢弃了,目前我sqlite3就会drop……后来改成了绝对路径DATABASE_NAME = 'd:/order/new2/data2.db'
TEMPLATE_DIRS 里面添加:
'./templates', 在新建的工程文件夹里面建一个叫templates的文件夹,模版都在里面
INSTALLED_APPS添加:
'new2.myorder',
后来出了一个什么unicode问题,就在末尾加了句:(虽然不太明白啥意思)
FILE_CHARSET = "gb2312"
然后去修改新建的myorder app了
里面的models放了三个类 把该app的models.py文件改成了下面这样,
(http://www.djangoproject.com/
Each model is a Python class that subclasses django.db.models.Model.
Each attribute of the model represents a database field. ):
from django.db import models
class restItem(models.Model) :
restName = models.CharField(maxlength=20)
restTel = models.IntegerField()
restAddress = models.CharField(maxlength=30)
class orderItem(models.Model):
workerName = models.CharField(maxlength=10)
dishName = models.CharField(maxlength=20)
dishPrice = models.FloatField()
orderTime = models.DateTimeField(auto_now=True) #自动记录该条实例创建的时间,不用自己赋值
orderRest = models.ForeignKey(restItem)
class dishItem(models.Model):
dishName = models.CharField(maxlength=20)
dishPrice = models.FloatField()
dishRest = models.ForeignKey(restItem)
dishTime = models.DateTimeField(auto_now=True)
manage.py syncdb
初始化数据库,没有什么特别的,照提示做
manage.py runserver 运行 如果是写成manage.py runserver 0.0.0.0:8000就可以让其他ip访问这个服务,端口是8000,可以改成别的端口,不写ip就只能自己访问自己http://127.0.0.1:8000/
改本项目下面的urls.py为:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# Example:
# (r'^new2/', include('new2.foo.urls')),
(r'^inputorder/$', 'new2.myorder.views.inputOrder'),
(r'^statistic/$', 'new2.myorder.views.statistic'),
(r'^selectlist/$', 'new2.myorder.views.selectList'),
(r'^editorder/$', 'new2.myorder.views.editOrder'),
# Uncomment this for admin:
# (r'^admin/', include('django.contrib.admin.urls')),
)
中间添加的那些是url与相应的函数响应
那些响应都是在myorder app 的views.py里面的
views.py里面添加函数:
# Create your views here.
#coding=utf-8
from new2.myorder.models import *
#把自己的那几个类放进去,下面几个是可能用到的django和python的东西
from django.template import loader, Context
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response
from datetime import *
def inputOrder(request):
text = 'no blank!'
if request.GET.has_key('wName') :
wName = request.GET['wName'] #request是一个网络响应,一个数据包,里面是固定格式的数据
dName = request.GET['dName']
dPrice = request.GET['dPrice']
rName = request.GET['rName']
if (wName and dName and dPrice and rName ):
try:
orderRest = restItem.objects.get(restName=rName)# restItem.objects.get(条件)如果符合条件的不止一个就出错,还要看看是不是不存在,不存在也出错
except restItem.DoesNotExist:
text='new restItem added'
newRest = restItem(restName=rName,restTel='new',restAddress='new')
newRest.save()#保存数据,添加到数据库里面了
orderRest=newRest
newDish = dishItem(dishName=dName,dishPrice=dPrice,/
dishRest=newRest)
newDish.save()
try:
orderDish = dishItem.objects.get(dishName=dName,dishRest=orderRest)
except dishItem.DoesNotExist:
newDish = dishItem(dishName=dName,dishPrice=dPrice,/
dishRest=orderRest)
newDish.save()
newOrder= orderItem(workerName=wName,dishName=dName,/
dishPrice=dPrice,orderRest=orderRest)
newOrder.save()
text = 'New Order Is Added ! !'
orderList = orderItem.objects.order_by('-id') #排序
return render_to_response('myorder/inputorder.htm',{'orderItems':orderList,'sendMessage':text})
#把一个字典{'orderItems':orderList,'sendMessage':text}传给模版文件,字典的条目'orderItems' 'sendMessage' 就是在网页当中django引用的名字
def statistic(request):
toShowList = []
totalAll=0
total = 0
#if request.method == 'POST' :
workerList = orderItem.objects.values('workerName').distinct()#把workerName这个条目在数据库里面的值都列出来,非重复的值
for worker in workerList:
orderList = orderItem.objects.filter(workerName=worker['workerName'])#filter函数
for order in orderList :
total = total + order.dishPrice
toShowList.append({'workerName':worker['workerName'],'total':total})
totalAll=total+totalAll
print total,totalAll
total=0
#print toShowList[0]['workerName']
return render_to_response('myorder/statistic.htm',{'toShowList':toShowList,'all':totalAll})
def selectList(request):
#return HttpResponse('xxx')
sel_list =''
dobjects=[]
orderItems=[]
message='no blank !'
if request.GET.has_key('sel_list'):
sel_list=request.GET['sel_list']
#print sel_list
rest=restItem.objects.get(id=sel_list)
dobjects=dishItem.objects.filter(dishRest=rest)
if request.GET.has_key('yourNameForSel'):
yourNameForSel=request.GET['yourNameForSel']
orderItems=orderItem.objects.order_by('-id')
if yourNameForSel:
dishChoose = dict(request.GET)['dishChoose']#从request获得的复选框的数据(条目id),强制转换成列表以便后面用
if dishChoose:
dishToAdd=dishItem.objects.in_bulk(dishChoose).values()#in_bulk返回的是id为条目,实例为值的一个字典列 .values()就是把它的值,也就是实例都取出来成一个列表,以便下面用
for dish in dishToAdd:
newOrder = orderItem(workerName=yourNameForSel,dishName=dish.dishName,/
dishPrice=dish.dishPrice,orderRest=dish.dishRest)
newOrder.save()
message='New order added !'
orderItems=orderItem.objects.order_by('-id')
else :
message='no blank !'
robjects=restItem.objects.all()
return render_to_response('myorder/selectlist.htm',{'robjects':robjects,/
'dobjects':dobjects,'message':message,'orderItems':orderItems})
def editOrder(request) :
orderItems=[]
orderItems=orderItem.objects.order_by('-id')
if request.GET.has_key('editorder'):
editorder=request.GET['editorder']
if editorder:
editorder = dict(request.GET)['editorder']
orderdels=orderItem.objects.in_bulk(editorder).values()
for orderdel in orderdels:
orderdel.delete()
orderItems=orderItem.objects.order_by('-id')
return render_to_response('myorder/editorder.htm',{'orderItems':orderItems})
在templates文件夹下面添加对应的.html文件 如inputorder 我是在templates里面又建了myorder文件夹,所有的myorder用的都在里面放着
在base.htm里面想插入变动代码的地方放:
{% block content1 %}
{% endblock %}
下面是我的模版文件:
base.htm
"http://www.w3.org/TR/html4/loose.dtd">
手工输入
从菜单选择
统计总价
删除订单
{% block content1 %}
{% endblock %}
selectlist.htm
{% extends "myorder/base.htm" %}
{% block content1 %}
{%if dobjects%}
{%endif%}
{%if orderItems %}
ID
员工
菜名
价格
餐厅
时间
{% for orderItem in orderItems %}
{{ orderItem.id }}
{{ orderItem.workerName }}
{{ orderItem.dishName }}
{{ orderItem.dishPrice }}
{{ orderItem.orderRest.restName }}
{{ orderItem.orderTime }}
{% endfor %}
{%endif%}
{% endblock %}
inputorder.htm
{% extends "myorder/base.htm" %}
{% block content1 %}
ID
员工
菜名
价格
餐厅
时间
{% for orderItem in orderItems %}
{{ orderItem.id }}
{{ orderItem.workerName }}
{{ orderItem.dishName }}
{{ orderItem.dishPrice }}
{{ orderItem.orderRest.restName }}
{{ orderItem.orderTime }}
{% endfor %}
{% endblock %}
statistic.htm
{% extends "myorder/base.htm" %}
{% block content1 %}
员工
个人总价
{%for item in toShowList %}
{{item.workerName}}
{{item.total}}
{% endfor %}
公司总价
{{all}}
{% endblock %}
editorder.htm
{% extends "myorder/base.htm" %}
{% block content1 %}
{%if orderItems %}
{%endif%}
{% endblock %}
如果不想直接用form 的action也可以
function showList(){
document.formOrder.action="/order/showlist/";
document.formOrder.submit();
}
用button的onKeyup()函数调用
花了一个星期写成这个样子,开始的时候就一个模版,所有的函数都挤在里面,被头头说应该分开写才是正确的写代码的风格,从一窍不通,到通了一个缝%%&……
费了半天劲try to use
django-admin.py runserver --settings=mysite.settings
结果是应该设置
set PYTHONPATH=d:/order
set DJANGO_SETTINGS_MODULE=newtest.settings
我却
>>> import sys
>>> sys.path.append('D://order//newtest')
>>> sys.path