django2.2學(xué)習(xí)示例—訂單系統(tǒng)2—order應(yīng)用文件

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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哈肖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子念秧,更是在濱河造成了極大的恐慌淤井,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摊趾,死亡現(xiàn)場(chǎng)離奇詭異币狠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)砾层,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)漩绵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人肛炮,你說(shuō)我怎么就攤上這事止吐。” “怎么了侨糟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵碍扔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我秕重,道長(zhǎng)不同,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任溶耘,我火速辦了婚禮二拐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘汰具。我一直安慰自己,他們只是感情好菱魔,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布留荔。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪聚蝶。 梳的紋絲不亂的頭發(fā)上杰妓,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音碘勉,去河邊找鬼巷挥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛验靡,可吹牛的內(nèi)容都是我干的倍宾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胜嗓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼高职!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辞州,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怔锌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后变过,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體埃元,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年媚狰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岛杀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哈雏,死狀恐怖楞件,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裳瘪,我是刑警寧澤土浸,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站彭羹,受9級(jí)特大地震影響黄伊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜派殷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一还最、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毡惜,春花似錦拓轻、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春枣氧,著一層夾襖步出監(jiān)牢的瞬間溢十,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工达吞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留张弛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓酪劫,卻偏偏與公主長(zhǎng)得像吞鸭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子契耿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容