day51-Django項目-天天生鮮

一、注冊模塊

1.創(chuàng)建注冊驗證表單

from django import forms

from user.models import User


class UserRegisterForm(forms.Form):
    user_name = forms.CharField(max_length=20, min_length=5, required=True,
                                error_messages={
                                    'required': '用戶名必填',
                                    'max_length': '用戶名不能超過20位字符',
                                    'min_length': '用戶名不能少于5位字符',
                                })
    pwd = forms.CharField(max_length=20, min_length=8, required=True,
                          error_messages={
                              'required': '密碼必填',
                              'max_length': '密碼不能超過20位字符',
                              'min_length': '密碼不能少于8位字符'
                          })
    cpwd = forms.CharField(max_length=20, min_length=8, required=True,
                          error_messages={
                              'required': '確認密碼必填',
                              'max_length': '密碼不能超過20位字符',
                              'min_length': '密碼不能少于8位字符'
                          })
    email = forms.CharField(required=True,
                            error_messages={
                                'required': '郵箱必填'
                            })

    # 驗證時目派,會自動調(diào)用
    def clean(self):
        # 校驗用戶名是否已存在于數(shù)據(jù)庫
        user =User.objects.filter(username=self.cleaned_data.get('user_name')).first()
        if user:
            # 用戶已存在于數(shù)據(jù)庫,拋出異常
            raise forms.ValidationError({'user_name': '該用戶已存在'})
        # 校驗密碼是否相等
        pwd = self.cleaned_data.get('pwd')
        cpwd = self.cleaned_data.get('cpwd')
        if pwd != cpwd:
            raise forms.ValidationError({'pwd': '兩次密碼不一致'})
        return self.cleaned_data

2.注冊功能

from django.contrib.auth.hashers import make_password, check_password
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

from user.forms import UserRegisterForm, UserLoginForm
from user.models import User


def register(request):
    if request.method == 'GET':
        return render(request, 'register.html')

    if request.method == 'POST':
        # 使用表單做驗證
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            # 字段驗證成功,注冊用戶名不存在于數(shù)據(jù)庫,密碼和確認密碼是一致的
            username = form.cleaned_data['user_name']
            password = form.cleaned_data['pwd']
            email = form.cleaned_data['email']
            # 密碼加密:make_password()
            # from django.contrib.auth.hashers import make_password
            new_password = make_password(password)
            User.objects.create(username=username, password=new_password, email=email)
            return HttpResponseRedirect(reverse('user:login'))
        else:
            # 字段驗證不成功偏螺,將驗證失敗的信息返回給頁面
            errors = form.errors
            return render(request, 'register.html', {'errors': errors})

二、登錄模塊

1.創(chuàng)建登錄驗證表單

class UserLoginForm(forms.Form):
    username = forms.CharField(required=True,
                               error_messages={
                                   'required': '用戶名必填',
                               })
    pwd = forms.CharField(required=True,
                          error_messages={
                              'required': '密碼必填',
                          })

2.登錄功能

from django.contrib.auth.hashers import make_password, check_password
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

from user.forms import UserRegisterForm, UserLoginForm
from user.models import User


def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')

    if request.method == 'POST':
        # 使用表單驗證
        form = UserLoginForm(request.POST)
        if form.is_valid():
            # 驗證字段成功
            username = form.cleaned_data['username']
            pwd = form.cleaned_data['pwd']
            user = User.objects.filter(username=username).first()
            if user:
                # 校驗密碼是否一致
                if check_password(pwd, user.password):
                    # 校驗成功
                    request.session['user_id'] = user.id
                    return HttpResponseRedirect(reverse('goods:index'))
                else:
                    # 密碼錯誤
                    error_pwd = '賬號或密碼錯誤'
                    return render(request, 'login.html', {'error_pwd': error_pwd})
            else:
                error_pwd = '賬號或密碼錯誤'
                return render(request, 'login.html', {'error_pwd': error_pwd})
        else:
            errors = form.errors
            return render(request, 'login.html', {'errors': errors})


def user_center_info(request):
    if request.method == 'GET':
        return render(request, 'user_center_info.html')


def user_center_order(request):
    if request.method == 'GET':
        return render(request, 'user_center_order.html')


def user_center_site(request):
    if request.method == 'GET':
        return render(request, 'user_center_site.html')

三匆光、中間件校驗登錄狀態(tài)

1.定義校驗中間件

from django.http import HttpResponseRedirect
from django.urls import reverse
from django.utils.deprecation import MiddlewareMixin

from user.models import User


class LoginStatusMiddleware(MiddlewareMixin):
    def process_request(self, request):
        if request.path in [reverse('user:register'), reverse('user:login')]:
            return None
        user_id = request.session.get('user_id')
        if user_id:
            user = User.objects.get(pk=user_id)
            request.user = user
            return None
        else:
            return HttpResponseRedirect(reverse('user:login'))

    def process_response(self, request, response):
        return response

2.主頁面模塊

from django.shortcuts import render

from goods.models import Goods, GoodsCategory
from user.models import User


def index(request):
    if request.method == 'GET':
        data = {}
        # 循環(huán)商品分類
        for cate in GoodsCategory.CATEGORY_TYPE:
            # 獲取當前分類下的前四個商品信息
            goods = Goods.objects.filter(category_id=cate[0])[0:4]
            # 組裝成鍵值對套像,key為商品分類的名稱,value為當前分類的商品信息
            data[cate[1]] = goods
        return render(request, 'index.html', {'goods_category': data})

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末终息,一起剝皮案震驚了整個濱河市夺巩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌周崭,老刑警劉巖柳譬,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異续镇,居然都是意外死亡美澳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門摸航,熙熙樓的掌柜王于貴愁眉苦臉地迎上來制跟,“玉大人,你說我怎么就攤上這事忙厌≠灬” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵逢净,是天一觀的道長哥放。 經(jīng)常有香客問我,道長爹土,這世上最難降的妖魔是什么甥雕? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮胀茵,結(jié)果婚禮上社露,老公的妹妹穿的比我還像新娘。我一直安慰自己琼娘,他們只是感情好峭弟,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著脱拼,像睡著了一般瞒瘸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上熄浓,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天情臭,我揣著相機與錄音,去河邊找鬼。 笑死俯在,一個胖子當著我的面吹牛竟秫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跷乐,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肥败,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了劈猿?” 一聲冷哼從身側(cè)響起拙吉,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤潮孽,失蹤者是張志新(化名)和其女友劉穎揪荣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往史,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡仗颈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了椎例。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挨决。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖订歪,靈堂內(nèi)的尸體忽然破棺而出脖祈,到底是詐尸還是另有隱情,我是刑警寧澤刷晋,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布盖高,位于F島的核電站,受9級特大地震影響眼虱,放射性物質(zhì)發(fā)生泄漏喻奥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一捏悬、第九天 我趴在偏房一處隱蔽的房頂上張望撞蚕。 院中可真熱鬧,春花似錦过牙、人聲如沸甥厦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刀疙。三九已至,卻和暖如春摧莽,著一層夾襖步出監(jiān)牢的瞬間庙洼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留油够,地道東北人蚁袭。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像石咬,于是被迫代替她去往敵國和親揩悄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理鬼悠,服務發(fā)現(xiàn)删性,斷路器,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 1焕窝、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,980評論 3 119
  • 22年12月更新:個人網(wǎng)站關停蹬挺,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,181評論 22 257
  • 十五的月亮十六圓,為什么身邊我認為最重要的人它掂,卻是這樣鞍桶铩!給自己打點雞血虐秋,都快沒力氣了榕茧,加油!
    余生不后悔閱讀 134評論 0 0
  • 從夢的深處 返回 在朝霞和彩云間翻飛 輕輕地輕輕地隨風拂過 穿透時空的物語 攜著草的清香 花的芳菲 夾著溫馨 慢慢...
    一門桐梓閱讀 282評論 2 1