1. 程式人生 > >Python打造線上教學平臺——學習週報4

Python打造線上教學平臺——學習週報4

業務邏輯開發

		                           ——————  學習週報 2018.12.2


一 、本週計劃:

  • 完成上週第6章剩餘的2節學習 ——— 找回密碼
  • 完成第7章—— 課程機構功能實現(7-1 ------- 7-8)
    • 模組繼承
    • 課程機構列表頁資料展示
    • 列表分頁功能
    • 列表篩選功能
    • modelform提交我要學習諮詢

二 、完成情況:

  • 實現找回密碼
  • 實現模組繼承
  • 實現課程機構列表頁資料展示
  • 實現列表分頁功能
  • 實現列表篩選功能
  • 實現modelform提交我要學習諮詢


三、 展示:

1、通過Django後臺找回密碼

  • forgetpwd.html頁面:
    應該注意增加:{% csrf_token %}和{% load staticfiles %}
    在這裡插入圖片描述
  • activt_fail.html:

在這裡插入圖片描述

  • send_sucess.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
<p>郵件已傳送, 請查收</p>

</body>
</html>
  • 當在忘記密碼頁面輸入郵箱和驗證碼後,彈出提示資訊:
    在這裡插入圖片描述

檢查郵箱:——成功接收
在這裡插入圖片描述

  • 寫頁面重置password_reset.html頁面:(當把收到郵件的連結進入後)

在這裡插入圖片描述

進入此頁面後,之前程式碼中的<input type="hidden" name="email" value="{{ email }}">的這一句就會發生變化,在網頁檢視原始碼後發現<input type="hidden" name="email" value="[email protected]">這一句就會自動上傳我之前忘記密碼填寫的郵箱,自動判斷我修改的是我之前填寫的郵箱的修改密碼。

  • 在view.py中寫forgetpwd方法(並在url中註冊)

  • 在view.py中寫ResetView(方法(並在url中註冊)

  • 進入密碼重置頁面,需要填寫密碼並提交,所以需要配置form.py表單:

class ForgetForm(forms.Form):
    email = forms.EmailField(required=True)
    captcha = CaptchaField(error_messages={"invalid": u"驗證碼錯誤"})


class ModifyPwdForm(forms.Form):
    password1 = forms.CharField(required=True, min_length=5)
    password2 = forms.CharField(required=True, min_length=5)

  • 在view.py中寫 ModifyPwdView方法(並在url中註冊)

----》實現找回密碼!


4、實現模組繼承

  • 使用 {% block title %}機構首頁 - 慕學網{% endblock %}就是為了子模板可以繼承它或者說是重寫它。

例子: 繼承base.html實現org-listhtml:

  • 錯誤1:在base.html檔案中的css,js等指明路徑時,由於我還是採用原來的static/ 去指明路徑,這樣就導致樣式檔案沒有加載出來,找不到路徑, 應該用{% static ‘js/deco-common.js’%},這樣才能找到static的路徑。
  • 重新指定路徑後,正常顯示:
    在這裡插入圖片描述

3、實現課程機構列表頁資料展示

  • 對後臺管理系統進行操作,存入“城市”“課程機構”的資訊。
    在這裡插入圖片描述
    • 對org-list.html檔案進行更改,將機構名稱,城市,共多少家等靜態資料改為動態資料。
      例子:對城市進行傳入動態資料:
   {% for city in all_citys %}
        <a href="?city=1&ct="><span class="">{{ city.name }}</span></a>
   {% endfor %}
  • 一定要記得在setting中—'django.core.context_processors.media',

TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'django.core.context_processors.media', ], }, }, ]

4、 實現列表分頁功能

  • 引入做分頁的開發庫(很強大的一個庫):pure pagination
    在這裡插入圖片描述

  • 安裝:pip install django-pure-paginatio
    在這裡插入圖片描述
    解決pip安裝黃字提示–version問題:python -m pip install --upgrade pip
    在這裡插入圖片描述在這裡插入圖片描述

  • 使用開發庫:
    在這裡插入圖片描述
    在這裡插入圖片描述
    在這裡插入圖片描述

  • 配置org_list.html,setting.py,organiation/vews.py,實現分頁功能,5個一頁:p = Paginator(all_orgs, 5, request=request)

  • 實現自動分頁,不再是寫死的:


		 <div class="pageturn">
            <ul class="pagelist">
                 {% if all_orgs.has_previous %}
                    <li class="long"><a href="?{{ all_orgs.previous_page_number.querystring }}">上一頁</a></li>
                 {% endif %}

                  {% for page in all_orgs.pages %}
                    {% if page %}
                        {% ifequal page all_orgs.number %}
                             <li class="active"><a href="?{{ page.querystring }}">{{ page }}</a></li>
                        {% else %}
                             <li><a href="?{{ page.querystring }}" class="page">{{ page }}</a></li>
                        {% endifequal %}
                    {% else %}
                        <li class="none"><a href="">...</a></li>
                    {% endif %}
                {% endfor %}
                {% if all_orgs.has_next %}
                    <li class="long"><a href="?{{ all_orgs.next_page_number.querystring }}">下一頁</a></li>
                {% endif %}

            </ul>
         </div>

5、實現列表篩選功能

  • 城市篩選:
					<h2>所在地區</h2>
					<div class="more">更多</div>
					<div class="cont">
                        <a href="?ct={{ category }}"><span class="{% ifequal city_id '' %}active2{% endifequal %}">全部</span></a>
                            {% for city in all_citys %}
                                <a href="?city={{ city.id }}&ct={{ category }}"><span class="{% ifequal city_id city.id|stringformat:"i" %}active2{% endifequal %}">{{ city.name }}</span></a>
                            {% endfor %}
					</div>
  • 類別篩選:
					<h2>機構類別</h2>
					<div class="cont">
                        <a href="?city={{ city_id }}"><span class="{% ifequal category '' %}active2{% endifequal %}">全部</span></a>

                            <a href="?ct=pxjg&city={{ city_id }}"><span class="{% ifequal category 'pxjg' %}active2{% endifequal %}">培訓機構</span></a>

                            <a href="?ct=gx&city={{ city_id }}"><span class="{% ifequal category 'gx' %}active2{% endifequal %}">高校</span></a>

                            <a href="?ct=gr&city={{ city_id }}"><span class="{% ifequal category 'gr' %}active2{% endifequal %}">個人</span></a>

					</div>
  • 授課機構排名的排序功能:——根據點選量
			<div class="head">授課機構排名</div>

            {% for curent_org in hot_orgs %}
                <dl class="des">
                    <dt class="num fl">{{ forloop.counter }}</dt>
                    <dd>
                        <a href="/company/2/"><h1>{{ curent_org.name }}</h1></a>
                        <p>{{ curent_org.address }}</p>
                    </dd>
                </dl>
            {% endfor %}

在這裡插入圖片描述

  • 按類別篩選後,按學習人數和課程數排名:
    在這裡插入圖片描述

6、實現modelform提交我要學習諮詢

為了避免後期維護大,在每一個app下建立自己的urls.py,便於維護。

  • organization下建立form.py表單:(model轉化為form)
  • organization下的view.py寫class AddUserAskView(View)類:
class AddUserAskView(View):
    """
    使用者新增諮詢
    """
    def post(self, request):
        userask_form = UserAskForm(request.POST)
        if userask_form.is_valid():
            user_ask = userask_form.save(commit=True)
            return HttpResponse('{"status":"success"}', content_type='application/json')
        else:
            return HttpResponse('{"status":"fail", "msg":"添加出錯"}', content_type='application/json')
  • 通過HttpResponse可以指明我們給使用者返回什麼資料(json):
HttpResponse('{"status":"success"}', content_type='application/json')
  • 表單js程式碼:
{% block custom_js %}
    <script>
    $(function(){
        $(document).ready(function() {
            $('#jsStayBtn').on('click', function () {
                $.ajax({
                    cache: false,
                    type: "POST",
                    url: "/org/add_ask/",
                    data: $('#jsStayForm').serialize(),
                    async: true,
                    success: function (data) {
                        if (data.status == 'success') {
                            $('#jsStayForm')[0].reset();
                            alert("提交成功")
                        } else if (data.status == 'fail') {
                            $('#jsCompanyTips').html(data.msg)
                        }
                    },
                });
            });
        });
    })

</script>
{% endblock %}

  • 頁面:

    • 什麼都不填時:
      在這裡插入圖片描述
      -提交時:
      在這裡插入圖片描述
  • 檢視後臺資料庫:
    在這裡插入圖片描述

  • 增加驗證手機號: (在organization下的form.py表單)——(正則表示式做)

	import re
    def clean_mobile(self):
        """
        驗證手機號碼是否合法
        """
        mobile = self.cleaned_data['mobile']
        REGEX_MOBILE = "^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"
        p = re.compile(REGEX_MOBILE)
        if p.match(mobile):
            return mobile
        else:
            raise forms.ValidationError(u"手機號碼非法", code="mobile_invalid")

下週任務:

  • 完成第7章剩餘的——(7-9 ~ 7-12)
    • 機構詳情展示
    • 課程機構收藏
  • 完成第8章—— (8-1 ~ 8~3)
    • 課程列表
    • 課程詳情頁