models.py模型文件
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Adm(models.Model): #用于存儲(chǔ)管理員名稱(chēng)
name = models.ForeignKey(User,on_delete=models.CASCADE)
def __str__(self):
return self.name.username
class Customer(models.Model): #客戶信息
name = models.CharField(max_length=50,null=False)
belong_to = models.ForeignKey(User,on_delete=models.DO_NOTHING) #所屬業(yè)務(wù)員
remark = models.CharField(max_length=200,null=True,default=' ') #備注
def __str__(self):
return self.name
class Order(models.Model): # 訂單信息夯巷,因?yàn)椴灰鼋y(tǒng)計(jì)钥顽,顧設(shè)置的比較簡(jiǎn)單
e_name = models.CharField(max_length=20)
c_name = models.ForeignKey(Customer, on_delete=models.DO_NOTHING) # 客戶名稱(chēng)
new_choice = (('yes','新客戶'),('no','老客戶'))
is_new = models.CharField(max_length=6,choices=new_choice,default='no') # 是否新客戶
p_make = models.CharField(max_length=30,default=' ') # 品牌
p_name = models.CharField(max_length=50,default=' ') # 產(chǎn)品
p_spec = models.CharField(max_length=20,default=' ') #規(guī)格
p_price = models.CharField(max_length=15,default=' ') #單價(jià)
p_num = models.CharField(max_length=20, default=' ') #數(shù)量
invoice_choice = (('after','后開(kāi)票'),('pre','預(yù)付款'))
invoice_stat = models.CharField(max_length=10,choices=invoice_choice,default='after') # 記錄發(fā)票
p_time = models.DateTimeField(default=timezone.now) # 記錄訂單生成時(shí)間
h_name = models.CharField(max_length=15,default='') # 記錄處理者名稱(chēng)
h_time = models.DateTimeField(auto_now=True) # 記錄訂單處理時(shí)間
stats_choice = (('done','已處理'),('waiting','未處理'))
order_stat = models.CharField(max_length=10,choices=stats_choice,default='waiting') #記錄訂單是否處理
remark = models.CharField(max_length=200,default='') #備注
huohao = models.CharField(max_length=100,default='') #貨號(hào)
def __str__(self):
return self.c_name.name + ' ' + self.p_make + ' ' + self.p_name + ' ' + self.p_spec
views.py視圖函數(shù)文件,里面部分小功能跟實(shí)際使用的比做了一些重構(gòu)压固,使代碼更簡(jiǎn)潔
from django.shortcuts import render, HttpResponseRedirect, Http404
from django.urls import reverse
from .forms import OrderForm, CustomerForm
from .models import Customer, Order, Adm
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from datetime import timedelta, datetime
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def index(request):
return render(request, 'index.html')
def paginator_test(request, orders): # 分頁(yè)函數(shù),參數(shù)是發(fā)起的請(qǐng)求和獲得的訂單查詢結(jié)果對(duì)象
paginator = Paginator(orders, 10) # 每頁(yè)10條結(jié)果
page = request.GET.get('page') # 獲取查詢的請(qǐng)求頁(yè)面
try:
orders = paginator.page(page) # 獲取查詢頁(yè)
except PageNotAnInteger:
orders = paginator.page(1) # 如果不是整數(shù)鸥跟,返回第1頁(yè)
except EmptyPage:
orders = paginator.page(paginator.num_pages) # 如果超出范圍舌胶,返回最后1頁(yè)
return orders, page
def test_adm(request): # 檢查訪問(wèn)者是否是管理員
try:
Adm.objects.get(name=request.user)
return True
except:
return False
@login_required
def orders(request):
"""業(yè)務(wù)員查詢到個(gè)人所有訂單,管理員查詢到所有業(yè)務(wù)員訂單,可以設(shè)置簡(jiǎn)單條件篩選"""
adm = test_adm(request)
if adm:
orders = Order.objects.order_by('-p_time')
else:
orders = Order.objects.filter(e_name=request.user.username).order_by('-p_time')
if request.method == "POST":
or_stat = request.POST.get('or_stat')
in_stat = request.POST.get('in_stat')
if or_stat != 'all':
orders = orders.filter(order_stat=or_stat)
if in_stat != 'all':
orders = orders.filter(invoice_stat=in_stat)
orders, page = paginator_test(request, orders)
context = {'orders': orders, 'adm': adm, 'page': page}
return render(request, 'orders.html', context)
@login_required
def customers(request):
"""業(yè)務(wù)員顯示自己所有客戶畜吊,管理員顯示所有業(yè)務(wù)員客戶"""
adm = test_adm(request)
if adm:
customers = Customer.objects.order_by('name')
else:
customers = Customer.objects.filter(belong_to=request.user).order_by('name')
context = {'customers': customers, 'adm': adm}
return render(request, 'customers.html', context)
@login_required
def someone_customers(request, user_id):
"""查詢某個(gè)業(yè)務(wù)員所有客戶"""
try:
user = User.objects.get(id=user_id) # 如果有手動(dòng)輸入,判斷用戶是否存在
except:
raise Http404
adm = test_adm(request)
if not adm: # 如果不是管理員户矢,不許訪問(wèn)此函數(shù)
return HttpResponseRedirect(reverse('order:customers'))
customers = user.customer_set.all() # 獲得用戶所有客戶
context = {'customers': customers, 'adm': adm}
return render(request, 'customers.html', context)
def check_legal(request, customer):
if not test_adm(request): # 如果不是管理員玲献,對(duì)他人訂單任何操作都拋出錯(cuò)誤
if customer.belong_to.username != request.user.username: # 如果客戶所屬業(yè)務(wù)員和訪問(wèn)者不是同一人
raise Http404
return True
@login_required
def customer(request, customer_id):
"""顯示單個(gè)用戶的所有訂單,業(yè)務(wù)員查詢單個(gè)客戶訂單時(shí),不顯示業(yè)務(wù)員名和老師名"""
try: # 客戶不存在則報(bào)錯(cuò)捌年,手動(dòng)輸入存在錯(cuò)誤
customer = Customer.objects.get(id=customer_id)
except:
raise Http404
check_legal(request, customer)
orders = customer.order_set.order_by('-p_time') # 獲得要查詢用戶的所有訂單
orders, page = paginator_test(request, orders) # 使用分頁(yè)函數(shù)瓢娜,獲取分頁(yè)情況
context = {'orders': orders, 'customer': customer, 'page': page}
return render(request, 'customer.html', context)
@login_required
def new_customer(request):
if request.method != "POST":
form = CustomerForm(initial={'remark': '選填'}) # 初始化備注內(nèi)容
else:
form = CustomerForm(data=request.POST) # 獲得提交數(shù)據(jù)
if form.is_valid(): # 驗(yàn)證數(shù)據(jù)的有效性
new_customer = form.save(commit=False) # 保存數(shù)據(jù),但是暫時(shí)不提交
new_customer.belong_to = request.user # 關(guān)聯(lián)客戶與業(yè)務(wù)員
new_customer.save() # 保存數(shù)據(jù)
return HttpResponseRedirect(reverse('order:customers'))
context = {'form': form} # 把表單傳遞給網(wǎng)頁(yè)
return render(request, 'new_customer.html', context)
@login_required
def new_order(request, customer_id):
try: # 判斷是否正常延窜,排除手動(dòng)輸入出錯(cuò)情況
customer = Customer.objects.get(id=customer_id)
except:
raise Http404
check_legal(request, customer)
if request.method != "POST": # 以GET方式打開(kāi)頁(yè)面恋腕,進(jìn)行一些非必填項(xiàng)初始化
form = OrderForm(initial={'e_name': request.user,'c_name': customer, 'p_make': '選填', 'p_spec': '選填', 'remark': '選填'})
else:
form = OrderForm(data=request.POST)
if form.is_valid():
new_order = form.save(commit=False)
new_order.c_name = customer
new_order.save()
return HttpResponseRedirect(reverse('order:customer', args=[customer_id])) # 返回該客戶所有訂單
context = {'customer': customer, 'form': form}
return render(request, 'new_order.html', context)
@login_required
def edit_order(request, order_id):
"""編輯訂單"""
try:
order = Order.objects.get(id=order_id)
except:
raise Http404
customer = order.c_name
check_legal(request, customer)
if request.method != "POST":
form = OrderForm(instance=order) # 初始化要修改的數(shù)據(jù)表單
else:
form = OrderForm(instance=order, data=request.POST) # 獲取表單提交數(shù)據(jù)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('order:customer', args=[customer.id]))
context = {'order': order, 'customer': customer, 'form': form}
return render(request, 'edit_order.html', context)
@login_required
def edit_customer(request, customer_id):
"""編輯客戶"""
try:
customer = Customer.objects.get(id=customer_id)
except:
raise Http404
check_legal(request, customer)
if request.method != "POST":
form = CustomerForm(instance=customer)
else:
form = CustomerForm(instance=customer, data=request.POST)
form.save()
return HttpResponseRedirect(reverse('order:customers'))
context = {'customer': customer, 'form': form}
return render(request, 'edit_customer.html', context)
@login_required
def del_order(request, order_id):
"""刪除訂單"""
try:
order = Order.objects.get(id=order_id)
except:
raise Http404
customer = order.c_name
check_legal(request, customer)
order.delete()
return HttpResponseRedirect(reverse('order:orders'))
@login_required
def done(request, order_id):
"""管理員確認(rèn)訂單處理,修改訂單狀態(tài)"""
try: # 驗(yàn)證訂單真實(shí)性
get_order = Order.objects.get(id=order_id)
except:
raise Http404
customer = get_order.c_name
check_legal(request, customer)
get_order.order_stat = 'done' # 修改訂單狀態(tài)
get_order.h_name = request.user.username # 修改訂單處理人
get_order.save()
return HttpResponseRedirect(reverse('order:orders'))
@login_required
def search(requset):
"""訂單搜索"""
global tem_search # 定義變量逆瑞,存儲(chǔ)中間搜索結(jié)果
try:
cur_user = Adm.objects.get(name=requset.user)
# 如果當(dāng)前用戶是管理員荠藤,則返回所有客戶
customers = Customer.objects.all()
except:
# 否則之返回登錄用戶的所有客戶
customers = User.objects.get(username=requset.user.username).customer_set.all()
context = {'customers': customers}
if requset.GET.get('page'):
orders = tem_search
orders, page = paginator_test(requset, orders)
context.update({'orders': orders, 'page': page})
elif requset.method == 'POST':
"""獲取搜索條件"""
cust_id = requset.POST.get('customer')
or_stat = requset.POST.get('or_stat')
in_stat = requset.POST.get('in_stat')
date_s = requset.POST.get('date_s')
date_e = requset.POST.get('date_e')
date_e = datetime.strptime(date_e, "%Y-%m-%d") + timedelta(days=1) # 增加一天的時(shí)間偏移量,獲取的時(shí)間默認(rèn)為日期的0點(diǎn)
cus_obj = Customer.objects.get(id=cust_id) # 獲取要查詢的客戶
orders = cus_obj.order_set.order_by('-p_time') # 獲得該客戶的所有訂單
if or_stat != 'all':
orders = orders.filter(order_stat=or_stat)
if in_stat != 'all':
orders = orders.filter(invoice_stat=in_stat)
orders = orders.filter(p_time__range=(date_s, date_e))
tem_search = orders # 把搜索結(jié)果存儲(chǔ)起來(lái)
orders, page = paginator_test(requset, orders)
context.update({'orders': orders, 'page': page})
return render(requset, 'search.html', context)
forms.py django自帶表單管理模塊
from django import forms
from .models import Order,Customer
class OrderForm(forms.ModelForm):
class Meta:
model = Order
fields = ['e_name', 'c_name', 'is_new', 'p_make', 'p_name', 'huohao','p_spec', 'p_price', 'p_num', 'invoice_stat', 'remark']
labels = {'e_name':'業(yè)務(wù)員', 'c_name': '客戶名', 'is_new': '是否新用戶', 'p_make': '品牌', 'huohao':'貨號(hào)','p_name': '產(chǎn)品名稱(chēng)', 'p_spec': '規(guī)格', 'p_price': '價(jià)格',
'p_num': '數(shù)量', 'invoice_stat': '發(fā)票', 'remark': '備注'}
widgets = {'remark': forms.Textarea(attrs={'cols': 50}),'e_name':forms.HiddenInput()}
class CustomerForm(forms.ModelForm):
# remark = forms.CharField(required=False) #設(shè)置該字段非必填
class Meta:
model = Customer
fields = ['name','remark']
labels = {'name':'客戶名','remark':'備注'}
widgets = {'remark':forms.Textarea(attrs={'cols':50})}
urls.py路由配置文件
from django.urls import re_path # 默認(rèn)正則需要使用re_path
from . import views
urlpatterns = [
re_path('^$',views.index,name='index'), #首頁(yè)
re_path('^orders/$',views.orders,name='orders'), #查看所有訂單
re_path('^new_order/(?P<customer_id>\d+)/$',views.new_order,name='new_order'), #創(chuàng)建新訂單
re_path('^customers/$',views.customers,name='customers'), #顯示用戶所有客戶
re_path('^customer/(?P<customer_id>\d+)/$',views.customer,name='customer'), #顯示該客戶所有訂單
re_path('^new_customer/$', views.new_customer, name='new_customer'), #創(chuàng)建新客戶
re_path('^edit_order/(?P<order_id>\d+)/$',views.edit_order,name='edit_order'), #編輯訂單
re_path('^edit_customer/(?P<customer_id>\d+)/$',views.edit_customer,name='edit_customer'),
re_path('^del_order/(?P<order_id>\d+)/$',views.del_order,name='del_order'),
re_path('^done/(?P<order_id>\d+)/$',views.done,name='done'),
re_path('^someone_customers/(?P<user_id>\d+)/$',views.someone_customers,name='someone_customers'),
re_path('^search/$',views.search,name='search'),
]
admin.py后臺(tái)管理注冊(cè)數(shù)據(jù)模型,如果想在后臺(tái)看到更多顯式格式获高,網(wǎng)上有很多資料
from django.contrib import admin
from .models import Customer,Order,Adm
admin.site.register(Customer)
admin.site.register(Order)
admin.site.register(Adm)