(項目)在線教育平臺(六)

八、授課機構功能

1、模板繼承

  如果幾個頁面的大體結構相同,可以使用繼承的方式來實現母版的重用性,也就是子版繼承母版的內容,既可以使用模板的內容,也可以重寫需要改變的地地方。

  首先完成授課機構的頁面,通過頁面顯示發現,

  先把org-list.html頁面拷貝到templates下,在該目錄下新建base.html頁面,然后將org-list.html內容剪切到base.html下,然后修改靜態文件的路徑,在base.html頁面下找到需要block的地方,以供子版繼承重寫:

  org-list.html繼承base.html,自定義org-list.html頁面中的內容:

  base.html頁面還需要修改的地方是頂部登錄注冊的顯示問題,這個問題和index.html頁面的一樣,只需要將index頁面的拷貝過來即可。

2、后端機構列表接口

2.1 機構列表接口

  在organization/views.oy文件下編寫機構列表的接口:

1 class OrgView(View):
2     """機構列表"""
3     def get(self, request):
4         return render(request, 'org-list.html')

  配置url:

1 from organization.views import OrgView
2 
3 urlpatterns = [
4     path('org_list/', OrgView.as_view(), name='org_list')  # 機構列表
5 ]

  然后修改index.html導航欄跳轉到機構列表的url:

  現在訪問機構列表頁就可以看到頁面了。

2.2 后臺添加數據

  后臺添加城市的相關數據:

  后臺添加機構的相關數據,不過需要先在organization/models.py機構中添加一個字段category,用來區分機構的類別:

 1 class CourseOrg(models.Model):
 2     """課程機構"""
 3     CATEGORY_CHOICES = (
 4         ('pxjg', '培訓機構'),
 5         ('gx', '高校'),
 6         ('gr', '個人')
 7     )
 8     name = models.CharField('機構名稱', max_length=50)
 9     category = models.CharField('機構類別', max_length=20, choices=CATEGORY_CHOICES, default='pxjg')
10     desc = models.TextField('機構描述')
11     click_nums = models.IntegerField('點擊數', default=0)
12     fav_nums = models.IntegerField('收藏數', default=0)
13     image = models.ImageField('封面圖', upload_to='org/%Y/%m', max_length=100)
14     address = models.CharField('地址', max_length=150)
15     city = models.ForeignKey(CityDict, verbose_name='所在城市', on_delete=models.CASCADE)
16     add_time = models.DateTimeField('添加時間', default=datetime.now)
17 
18     class Meta:
19         verbose_name = '課程機構'
20         verbose_name_plural = verbose_name

  修改之后需要遷移數據庫。

  在后臺添加機構信息的時候需要上傳機構的圖片,在項目根目錄下新建一個media,用來存放上傳的圖片,然后在settings.py文件中設置上傳文件的路徑:

1 # 上傳文件的路徑
2 MEDIA_URL = '/media/'
3 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

  然后現在添加機構的數據:

2.3 完善機構列表的接口

 1 class OrgView(View):
 2     """機構列表"""
 3     def get(self, request):
 4         # 取出所有的機構
 5         all_orgs = CourseOrg.objects.all()
 6         org_nums = all_orgs.count()
 7 
 8         # 取出所有的城市
 9         all_citys = CityDict.objects.all()
10 
11         return render(request, 'org-list.html', {
12             'all_orgs': all_orgs,
13             'all_citys': all_citys,
14             'org_nums': org_nums
15         })

  然后修改前端org-list.html顯示的內容:

  要顯示后臺的圖片,需要在settings.py中的TEMPLATES添加圖片處理器django.template.context_processors.media,如下:

 1 TEMPLATES = [
 2     {
 3         'BACKEND': 'django.template.backends.django.DjangoTemplates',
 4         'DIRS': [os.path.join(BASE_DIR, 'templates')]
 5         ,
 6         'APP_DIRS': True,
 7         'OPTIONS': {
 8             'context_processors': [
 9                 'django.template.context_processors.debug',
10                 'django.template.context_processors.request',
11                 'django.contrib.auth.context_processors.auth',
12                 'django.contrib.messages.context_processors.messages',
13                 # 圖片處理器,為了在課程列表中前面加上MEDIA_URL
14                 'django.template.context_processors.media',
15             ],
16         },
17     },
18 ]

  然后在urls中配置處理圖片的url,固定寫法:

1 from django.views.static import serve
2 from MxOnline.settings import MEDIA_ROOT
3 
4 urlpatterns = [
5     re_path(r'^media/(?P<path>.*)', serve, {"document_root": MEDIA_ROOT}),  # 處理圖片顯示
6 ]

  現在刷新列表頁即可看到如下效果:

3、分頁功能

  機構如果超出每一頁的數量,就需要使用分頁,在這里使用第三方庫django-pure-pagination來實現分頁。

3.1 安裝

  在虛擬環境中直接pip install django-pure-pagination

3.2 注冊

  將pure_pagination注冊進INSTALLED_APPS中:

1 INSTALLED_APPS = [
2     'pure_pagination',
3 ]

3.3 在機構列表接口加入分頁邏輯

 1 class OrgView(View):
 2     """機構列表"""
 3     def get(self, request):
 4         # 取出所有的機構
 5         all_orgs = CourseOrg.objects.all()
 6         org_nums = all_orgs.count()
 7 
 8         # 取出所有的城市
 9         all_citys = CityDict.objects.all()
10 
11         # 分頁
12         try:
13             page = request.GET.get('page', 1)
14         except PageNotAnInteger:
15             page = 1
16         p = Paginator(all_orgs, 5, request=request)
17         orgs = p.page(page)
18 
19         return render(request, 'org-list.html', {
20             'all_orgs': orgs,
21             'all_citys': all_citys,
22             'org_nums': org_nums
23         })

  然后修改org-list.html中的all_orgs:

  在org-list.html中修改前端分頁顯示的代碼:

  刷新列表頁后,每頁顯示5條機構:

4、篩選功能

4.1 城市篩選

  在機構列表接口中完善篩選數據的邏輯:

 1 class OrgView(View):
 2     """機構列表"""
 3     def get(self, request):
 4         # 取出所有的機構
 5         all_orgs = CourseOrg.objects.all()
 6         org_nums = all_orgs.count()
 7 
 8         # 取出所有的城市
 9         all_citys = CityDict.objects.all()
10 
11         # 篩選(從request中獲取城市的id)
12         city_id = request.GET.get('city', '')
13         if city_id:
14             all_orgs = all_orgs.filter(city_id=int(city_id))
15 
16         # 分頁
17         try:
18             page = request.GET.get('page', 1)
19         except PageNotAnInteger:
20             page = 1
21         p = Paginator(all_orgs, 5, request=request)
22         orgs = p.page(page)
23 
24         return render(request, 'org-list.html', {
25             'all_orgs': orgs,
26             'all_citys': all_citys,
27             'org_nums': org_nums,
28             'city_id': city_id
29         })

  前端顯示的修改如下:

4.2 類別篩選

  繼續在機構列表接口完善類別篩選功能:

 1 class OrgView(View):
 2     """機構列表"""
 3     def get(self, request):
 4         # 取出所有的機構
 5         all_orgs = CourseOrg.objects.all()
 6 
 7         # 取出所有的城市
 8         all_citys = CityDict.objects.all()
 9 
10         # 城市篩選(從request中獲取城市的id)
11         city_id = request.GET.get('city', '')
12         if city_id:
13             all_orgs = all_orgs.filter(city_id=int(city_id))
14 
15         # 類別篩選(從request中獲取機構類別ct)
16         category = request.GET.get('ct', '')
17         if category:
18             all_orgs = all_orgs.filter(category=category)
19 
20         # 篩選完再統計數量
21         org_nums = all_orgs.count()
22 
23         # 分頁
24         try:
25             page = request.GET.get('page', 1)
26         except PageNotAnInteger:
27             page = 1
28         p = Paginator(all_orgs, 5, request=request)
29         orgs = p.page(page)
30 
31         return render(request, 'org-list.html', {
32             'all_orgs': orgs,
33             'all_citys': all_citys,
34             'org_nums': org_nums,
35             'city_id': city_id,
36             'category': category
37         })

  前端的顯示修改內容如下:

  修改完成之后,篩選功能完成,可以根據類別和城市篩選機構:

4.3 機構排名篩選

  機構的排名按照點擊量進行排名,在機構列表接口中添加排名篩選邏輯:

 1 class OrgView(View):
 2     """機構列表"""
 3     def get(self, request):
 4         # 取出所有的機構
 5         all_orgs = CourseOrg.objects.all()
 6 
 7         # 取出所有的城市
 8         all_citys = CityDict.objects.all()
 9 
10         # 排名篩選(根據點擊量排名)
11         hot_orgs = all_orgs.order_by('-click_nums')[:3]
12 
13         # 城市篩選(從request中獲取城市的id)
14         city_id = request.GET.get('city', '')
15         if city_id:
16             all_orgs = all_orgs.filter(city_id=int(city_id))
17 
18         # 類別篩選(從request中獲取機構類別ct)
19         category = request.GET.get('ct', '')
20         if category:
21             all_orgs = all_orgs.filter(category=category)
22 
23         # 篩選完再統計數量
24         org_nums = all_orgs.count()
25 
26         # 分頁
27         try:
28             page = request.GET.get('page', 1)
29         except PageNotAnInteger:
30             page = 1
31         p = Paginator(all_orgs, 5, request=request)
32         orgs = p.page(page)
33 
34         return render(request, 'org-list.html', {
35             'all_orgs': orgs,
36             'all_citys': all_citys,
37             'org_nums': org_nums,
38             'city_id': city_id,
39             'category': category,
40             'hot_orgs': hot_orgs
41         })

  然后修改前端顯示代碼:

4.4 學習人數和課程排名篩選

  首先在organization/models.py中的CourseOrg中加入students和course_nums兩個字段:

 1 class CourseOrg(models.Model):
 2     """課程機構"""
 3     CATEGORY_CHOICES = (
 4         ('pxjg', '培訓機構'),
 5         ('gx', '高校'),
 6         ('gr', '個人')
 7     )
 8     name = models.CharField('機構名稱', max_length=50)
 9     category = models.CharField('機構類別', max_length=20, choices=CATEGORY_CHOICES, default='pxjg')
10     desc = models.TextField('機構描述')
11     students = models.IntegerField('學習人數', default=0)
12     course_nums = models.IntegerField('課程數', default=0)
13     click_nums = models.IntegerField('點擊數', default=0)
14     fav_nums = models.IntegerField('收藏數', default=0)
15     image = models.ImageField('封面圖', upload_to='org/%Y/%m', max_length=100)
16     address = models.CharField('地址', max_length=150)
17     city = models.ForeignKey(CityDict, verbose_name='所在城市', on_delete=models.CASCADE)
18     add_time = models.DateTimeField('添加時間', default=datetime.now)
19 
20     class Meta:
21         verbose_name = '課程機構'
22         verbose_name_plural = verbose_name
23 
24     def __str__(self):
25         return self.name

  然后遷移數據庫。

  然后在機構列表接口中完善學習人數和課程數排名的邏輯:

 1 class OrgView(View):
 2     """機構列表"""
 3     def get(self, request):
 4         # 取出所有的機構
 5         all_orgs = CourseOrg.objects.all()
 6 
 7         # 取出所有的城市
 8         all_citys = CityDict.objects.all()
 9 
10         # 排名篩選(根據點擊量排名)
11         hot_orgs = all_orgs.order_by('-click_nums')[:3]
12 
13         # 學習人數和課程數排名篩選
14         sort = request.GET.get('sort', '')
15         if sort:
16             if sort == 'students':
17                 all_orgs = all_orgs.order_by('-students')
18             elif sort == 'courses':
19                 all_orgs = all_orgs.order_by('-course_nums')
20 
21         # 城市篩選(從request中獲取城市的id)
22         city_id = request.GET.get('city', '')
23         if city_id:
24             all_orgs = all_orgs.filter(city_id=int(city_id))
25 
26         # 類別篩選(從request中獲取機構類別ct)
27         category = request.GET.get('ct', '')
28         if category:
29             all_orgs = all_orgs.filter(category=category)
30 
31         # 篩選完再統計數量
32         org_nums = all_orgs.count()
33 
34         # 分頁
35         try:
36             page = request.GET.get('page', 1)
37         except PageNotAnInteger:
38             page = 1
39         p = Paginator(all_orgs, 5, request=request)
40         orgs = p.page(page)
41 
42         return render(request, 'org-list.html', {
43             'all_orgs': orgs,
44             'all_citys': all_citys,
45             'org_nums': org_nums,
46             'city_id': city_id,
47             'category': category,
48             'hot_orgs': hot_orgs,
49             'sort': sort
50         })

  然后修改前端代碼:

5、我要學習咨詢功能

5.1 我要學習咨詢接口

  我要學習咨詢的表單這次使用ModelForm來實現,首先在organization下新建form.py文件:

1 from django import forms
2 from operation.models import UserAsk
3 
4 
5 class UserAskForm(forms.ModelForm):
6     """我要學習咨詢表單驗證"""
7     class Meta:
8         model = UserAsk
9         fields = ['name','mobile','course_name']

  編寫我要學習咨詢的后臺接口:

 1 class UserAskView(View):
 2     """我要學習咨詢"""
 3     def post(self, request):
 4         userask_form = UserAskForm(request.POST)
 5         if userask_form.is_valid():
 6             # 通過ModelForm可以直接將表單中的內容保存
 7             user_ask = userask_form.save(commit=True)
 8             # 通過ajax提交,給前端返回json數據
 9             return HttpResponse('{"status": "success"}', content_type='application/json')
10         else:
11             return HttpResponse('{"status": "fail", "msg": "添加出錯"}', content_type='application/json')

  現在使用路由分發的方式來配置url,首先刪除urls.py中的org_list這個路由,然后添加一級路由:

1 urlpatterns = [
2     # path('org_list/', OrgView.as_view(), name='org_list'),  # 機構列表
3     path('org/', include('organization.urls', namespace='org')),  # 機構列表
4 ]

  然后在organization下新建urls.py文件,在這個文件配置機構列表頁的相關url,之前刪除了機構列表的url,現在將機構列表和我要學習咨詢的url都添加到這個文件下:

 1 from django.urls import path, re_path
 2 
 3 from .views import OrgView, UserAskView
 4 
 5 app_name = 'organization'
 6 
 7 urlpatterns = [
 8     path('list/',OrgView.as_view(),name='org_list'),  # 機構列表
 9     path('user_ask/', UserAskView.as_view(), name='user_ask'),  # 我要學習咨詢
10 ]

  之前在首頁跳轉機構列表的url需要修改過來:

  然后在form中添加驗證手機號碼合法性的邏輯:

 1 import re
 2 
 3 from django import forms
 4 from operation.models import UserAsk
 5 
 6 
 7 class UserAskForm(forms.ModelForm):
 8     """我要學習咨詢表單驗證"""
 9     class Meta:
10         model = UserAsk
11         fields = ['name','mobile','course_name']
12 
13     def clean_mobile(self):
14         """驗證手機號合法性"""
15         mobile = self.cleaned_data['mobile']
16         REGEX_MOBILE = "^1[358]\d{9}$|^147\d{8}$|176\d{8}$"
17         p = re.compile(REGEX_MOBILE)
18         if p.match(mobile):
19             return mobile
20         else:
21             raise forms.ValidationError('手機號非法', code='mobile_invalid')

  我要學習咨詢表單是將數據ajax提交到后臺的,不刷新頁面,所以在前端要編寫script代碼:

?

轉載于:https://www.cnblogs.com/Sweltering/p/9973522.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450674.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言 socket 編程學習

對于SOCKET在這里我不想究其歷史,我只想說其時它是一種進程通訊的方式,簡言之就是調用這個網絡庫的一些API函數就能實現分布在不同主機的相關進程之間的數據交換. SOCKET中首先我們要理解如下幾個定義概念: 一是IP地址:IP Address我想很容易理解,就是依照TCP/IP協議分配…

dependency 中的 classifier屬性

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 classifier元素用來幫助定義構件輸出的一些附屬構件。附屬構件與主構件對應&#xff0c;比如主構件是 kimi-app-2.0.0.jar 該項目可能還…

PHP超全局變量$_SERVER

$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器創建。不能保證每個服務器都提供全部項目&#xff1b;服務器可能會忽略一些&#xff0c;或者提供一些沒有在這里列舉出來的項目。 $_SERVE…

VC讀寫XML文件

1、安裝MSXML 4.0 SP2。在VC6中建立一個基于Dialog的工程。如圖&#xff1a; 在界面上放置3個編輯框、1個按鈕控件。其中屬性設置如下。 編輯框&#xff1a; IDCategoryVariable TypeVariable NameIDC_IDValueCStringm_strIdIDC_AUTHORValueCStringm_strAuthorIDC_TITLEValueCS…

XCode10 swift4.2 適配遇到的坑

以下是2018年10月23日更新 經過大約一個月的時間的適配&#xff0c;項目正式使用XCode10(以下簡稱為10 or XC10)大部分庫都升級為Swift4.2&#xff08;以下簡稱為 4.2 or S4.2&#xff09;&#xff0c;下面是適配過程中遇到的一些坑。 1. Swift4、Swift4.2混編 如果你對項目是小…

學生管理系統Java版

簡單的學生管理系統 主界面編寫&#xff1a; 1.用輸出語句完成主界面的編寫 2.用Scanner語句實現鍵盤的錄入 3.用swich語句完成操作的選擇 4.用循環完成再次回到主界面 代碼實現&#xff1a; while (true) {//1.用輸出語句完成主界面的編寫System.out.println("--------…

dubbo 配置文件詳解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、dubbo常用配置 <dubbo:service/> 服務配置&#xff0c;用于暴露一個服務&#xff0c;定義服務的元信息&#xff0c;一個服務可…

ASP.NET Core 實戰:Linux 小白的 .NET Core 部署之路

一、前言 最近一段時間自己主要的學習計劃還是按照畢業后設定的計劃&#xff0c;自己一步步的搭建一個前后端分離的 ASP.NET Core 項目&#xff0c;目前也還在繼續學習 Vue 中&#xff0c;雖然中間斷了很長時間&#xff0c;好歹還是堅持下來了&#xff0c;嗯&#xff0c;看了看…

學以致用十三-----Centos7.2+python3+YouCompleteMe成功歷程

歷經幾天的摸索&#xff0c;趟過幾趟坑之后&#xff0c;終于完成YouCompleteMe的安裝配置。 今天同樣是個不能忘記的日子&#xff0c;國恥日&#xff0c;勿忘國恥。&#xff08;9.18&#xff09; 服務器安裝好&#xff0c;基本配置配置好后&#xff0c;開始安裝。 一、檢查服務…

VC畫圖用到的主要方法

1。鼠標落下&#xff0c;記錄鼠標的起始位置 void CMyEasyDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息處理程序代碼和/或調用默認值 //graph->m_nTypedlg-> m_bStartDraw true; m_PtPress m_PtLast point; CView::OnLButtonDown…

【最新版】Java學習路線(含B站口碑推薦視頻鏈接)

文章目錄關于如何自學一、計算機網絡二、數據結構與算法三、操作系統四、計算機組成原理五、編譯原理六、設計模式七、MySQL八、實操工具九、JAVA并發與JVM十、Redis十一、Linux十二、Java路線學習尚硅谷黑馬程序員動力節點狂神說十三、Java基礎十四、JavaWeb十五、框架十六、微…

記錄no static method cannot be reference

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a; no static method cannot be reference 我一直以為是在靜態方法中調用了非靜態方法&#xff0c;實際上只是我在注…

文件存儲權限

Android 6.0及以上&#xff0c;需要動態申請權限&#xff1a; Manifest.permission.READ_EXTERNAL_STORAGE Manifest.permission.WRITE_EXTERNAL_STORAGE <uses-permission-sdk-23 android:name"android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permis…

從工具的奴隸到工具的主人

摘要&#xff1a;我們每個人都是工具的奴隸。隨著我們的學習&#xff0c;我們不斷的加深自己對工具的認識&#xff0c;從而從它們里面解脫出來。現在我就來說一下我作為各種工具的奴隸&#xff0c;以及逐漸擺脫它們的思想控制的歷史吧。 當我高中畢業進入大學計算機系的時候&am…

記錄A component required a bean named ‘studentService‘ that could not be found.

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯如題&#xff1a; A component required a bean named studentService that could not be found. 出問題的代碼行&#xff1a; &l…

Java---利用程序實現在控制臺聊天

一.普通版&#xff08;不能實現隨意輸入&#xff09; 電腦A(服務器端) package day; import java.net.ServerSocket; import java.net.Socket; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;public class Mysever {public static void…

16.看板方法——三類改進機會筆記

00.三種常見的模型和它們一些變種&#xff1a;約束理論及其主要理念&#xff1b;還有聚焦于分析和減少變異性的模型及其變種等。 01.五步聚焦法 *a.識別約束 *b.作出決定&#xff0c;以最大化利用約束 *c.使系統中的其余一切部分都服從于b中做出決定 *d.突破約束 *e.避免惰性&a…

C/C++的64位整型

在C/C中&#xff0c;64為整型一直是一種沒有確定規范的數據類型。現今主流的編譯器中&#xff0c;對64為整型的支持也是標準不一&#xff0c;形態各異。一般來說&#xff0c;64位整型的定義方式有long long和__int64兩種(VC還支持_int64)&#xff0c;而輸出到標準輸出方式有pri…

記錄 Duplicate spring bean id dubbo

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 啟動工程 報錯如題&#xff1a; Duplicate spring bean id dubbo &#xff0c;意思是id 重復。 原因是我在加載配置文件時加載了兩個…

1.KafKa-介紹

轉載于:https://www.cnblogs.com/v-lcc/p/9674975.html