org-list.html頁面的實(shí)現(xiàn)基礎(chǔ)版本
后臺(tái)圖片上傳顯示
默認(rèn)后臺(tái)上傳圖片會(huì)在項(xiàng)目文件夾中生成org文件夾,然后依次按照日期生成子文件,在實(shí)際的開發(fā)中所有的媒體文件應(yīng)該在一個(gè)單獨(dú)的文件夾中
在settings.py中設(shè)置
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
配置url
path('orglist/', OrgView.as_view(), name='org_list'),
配置View層
from django.views.generic.base import View
class OrgView(View):
def get(self, request, *args, **kwargs):
#從數(shù)據(jù)庫中獲取數(shù)據(jù)
all_orgs = CourseOrg.objects.all()
org_nums = CourseOrg.objects.all().count()
all_citys = City.objects.all()
return render(request, "org-list.html",{
"all_orgs":all_orgs,
"org_nums":org_nums,
"all_citys":all_citys,
})
課程機(jī)構(gòu)的循環(huán)遍歷

在templates層顯示圖片
在settings.py的模板中設(shè)置,將media添加到上下文中,方便所有的模板訪問

實(shí)際添加的代碼
'django.template.context_processors.media',
前臺(tái)顯示圖片的地址

data-url="{{ MEDIA_URL }}{{ org.image }}"/>

建立課程相關(guān)courses 應(yīng)用并且注冊(cè)
from datetime import datetime
from django.db import models
from apps.users.models import BaseModel
#1. 設(shè)計(jì)表結(jié)構(gòu)有幾個(gè)重要的點(diǎn)
"""
實(shí)體1 <關(guān)系> 實(shí)體2
課程 章節(jié) 視頻 課程資源
"""
#2. 實(shí)體的具體字段
#3. 每個(gè)字段的類型,是否必填
class Course(BaseModel):
name = models.CharField(verbose_name="課程名", max_length=50)
desc = models.CharField(verbose_name="課程描述", max_length=300)
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時(shí)長(分鐘數(shù))")
degree = models.CharField(verbose_name="難度", choices=(("cj", "初級(jí)"), ("zj", "中級(jí)"), ("gj", "高級(jí)")), max_length=2)
students = models.IntegerField(default=0, verbose_name='學(xué)習(xí)人數(shù)')
fav_nums = models.IntegerField(default=0, verbose_name='收藏人數(shù)')
click_nums = models.IntegerField(default=0, verbose_name="點(diǎn)擊數(shù)")
notice = models.CharField(verbose_name="課程公告", max_length=300, default="")
category = models.CharField(default=u"后端開發(fā)", max_length=20, verbose_name="課程類別")
tag = models.CharField(default="", verbose_name="課程標(biāo)簽", max_length=10)
youneed_know = models.CharField(default="", max_length=300, verbose_name="課程須知")
teacher_tell = models.CharField(default="", max_length=300, verbose_name="老師告訴你")
is_classics = models.BooleanField(default=False, verbose_name="是否經(jīng)典")
is_banner = models.BooleanField(default=False, verbose_name="是否廣告位")
image = models.ImageField(upload_to="courses/%Y/%m", verbose_name="封面圖", max_length=100)
class Meta:
verbose_name = "課程信息"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
def lesson_nums(self):
return self.lesson_set.all().count()
def show_image(self):
from django.utils.safestring import mark_safe
return mark_safe("<img src='{}'>".format(self.image.url))
show_image.short_description = "圖片"
def go_to(self):
from django.utils.safestring import mark_safe
return mark_safe("<a href='/course/{}'>跳轉(zhuǎn)</a>".format(self.id))
go_to.short_description = "跳轉(zhuǎn)"
class Lesson(BaseModel):
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name="課程") #on_delete表示對(duì)應(yīng)的外鍵數(shù)據(jù)被刪除后,當(dāng)前的數(shù)據(jù)應(yīng)該怎么辦
name = models.CharField(max_length=100, verbose_name="章節(jié)名")
learn_times = models.IntegerField(default=0, verbose_name="學(xué)習(xí)時(shí)長(分鐘數(shù))")
class Meta:
verbose_name = "課程章節(jié)"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Video(BaseModel):
lesson = models.ForeignKey(Lesson, verbose_name="章節(jié)", on_delete=models.CASCADE)
name = models.CharField(max_length=100, verbose_name=u"視頻名")
learn_times = models.IntegerField(default=0, verbose_name=u"學(xué)習(xí)時(shí)長(分鐘數(shù))")
url = models.CharField(max_length=1000, verbose_name=u"訪問地址")
class Meta:
verbose_name = "視頻"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseResource(BaseModel):
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name="課程")
name = models.CharField(max_length=100, verbose_name=u"名稱")
file = models.FileField(upload_to="course/resourse/%Y/%m", verbose_name="下載地址", max_length=200)
class Meta:
verbose_name = "課程資源"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
建立課程機(jī)構(gòu)organizations應(yīng)用并且注冊(cè)
from django.db import models
from apps.users.models import BaseModel
class City(BaseModel):
name = models.CharField(max_length=20, verbose_name=u"城市名")
desc = models.CharField(max_length=200, verbose_name=u"描述")
class Meta:
verbose_name = "城市"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class CourseOrg(BaseModel):
name = models.CharField(max_length=50, verbose_name="機(jī)構(gòu)名稱")
tag = models.CharField(default="全國知名", max_length=10, verbose_name="機(jī)構(gòu)標(biāo)簽")
category = models.CharField(default="pxjg", verbose_name="機(jī)構(gòu)類別", max_length=4,
choices=(("pxjg", "培訓(xùn)機(jī)構(gòu)"), ("gr", "個(gè)人"), ("gx", "高校")))
click_nums = models.IntegerField(default=0, verbose_name="點(diǎn)擊數(shù)")
fav_nums = models.IntegerField(default=0, verbose_name="收藏?cái)?shù)")
image = models.ImageField(upload_to="org/%Y/%m", verbose_name="logo", max_length=100)
address = models.CharField(max_length=150, verbose_name="機(jī)構(gòu)地址")
students = models.IntegerField(default=0, verbose_name="學(xué)習(xí)人數(shù)")
course_nums = models.IntegerField(default=0, verbose_name="課程數(shù)")
is_auth = models.BooleanField(default=False, verbose_name="是否認(rèn)證")
is_gold = models.BooleanField(default=False, verbose_name="是否金牌")
city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name="所在城市")
def courses(self):
courses = self.course_set.filter(is_classics=True)[:3]
return courses
class Meta:
verbose_name = "課程機(jī)構(gòu)"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
from apps.users.models import UserProfile
class Teacher(BaseModel):
user = models.OneToOneField(UserProfile, on_delete=models.SET_NULL, null=True, blank=True,verbose_name="用戶")
org = models.ForeignKey(CourseOrg, on_delete=models.CASCADE, verbose_name="所屬機(jī)構(gòu)")
name = models.CharField(max_length=50, verbose_name=u"教師名")
work_years = models.IntegerField(default=0, verbose_name="工作年限")
work_company = models.CharField(max_length=50, verbose_name="就職公司")
work_position = models.CharField(max_length=50, verbose_name="公司職位")
points = models.CharField(max_length=50, verbose_name="教學(xué)特點(diǎn)")
click_nums = models.IntegerField(default=0, verbose_name="點(diǎn)擊數(shù)")
fav_nums = models.IntegerField(default=0, verbose_name="收藏?cái)?shù)")
age = models.IntegerField(default=18, verbose_name="年齡")
image = models.ImageField(upload_to="teacher/%Y/%m", verbose_name="頭像", max_length=100)
class Meta:
verbose_name = "教師"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
def course_nums(self):
return self.course_set.all().count()
建立用戶相關(guān)操作operations 應(yīng)用并且注冊(cè)
from django.db import models
from django.contrib.auth import get_user_model
from apps.users.models import BaseModel
from apps.courses.models import Course
UserProfile = get_user_model()
class Banner(BaseModel):
title = models.CharField(max_length=100, verbose_name="標(biāo)題")
image = models.ImageField(upload_to="banner/%Y/%m", max_length=200, verbose_name="輪播圖")
url = models.URLField(max_length=200, verbose_name="訪問地址")
index = models.IntegerField(default=0, verbose_name="順序")
class Meta:
verbose_name = "輪播圖"
verbose_name_plural = verbose_name
def __str__(self):
return self.title
class UserAsk(BaseModel):
name = models.CharField(max_length=20, verbose_name="姓名")
mobile = models.CharField(max_length=11, verbose_name="手機(jī)")
course_name = models.CharField(max_length=50, verbose_name="課程名")
class Meta:
verbose_name = "用戶咨詢"
verbose_name_plural = verbose_name
def __str__(self):
return "{name}_{course}({mobile})".format(name=self.name, course=self.course_name, mobile=self.mobile)
class CourseComments(BaseModel):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name="用戶")
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name="課程")
comments = models.CharField(max_length=200, verbose_name="評(píng)論內(nèi)容")
class Meta:
verbose_name = "課程評(píng)論"
verbose_name_plural = verbose_name
def __str__(self):
return self.comments
class UserFavorite(BaseModel):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name="用戶")
fav_id = models.IntegerField(verbose_name="數(shù)據(jù)id")
fav_type = models.IntegerField(choices=((1,"課程"),(2,"課程機(jī)構(gòu)"),(3,"講師")), default=1, verbose_name="收藏類型")
class Meta:
verbose_name = "用戶收藏"
verbose_name_plural = verbose_name
def __str__(self):
return "{user}_{id}".format(user=self.user.username, id=self.fav_id)
class UserMessage(BaseModel):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name="用戶")
message = models.CharField(max_length=200, verbose_name="消息內(nèi)容")
has_read = models.BooleanField(default=False, verbose_name="是否已讀")
class Meta:
verbose_name = "用戶消息"
verbose_name_plural = verbose_name
def __str__(self):
return self.message
class UserCourse(BaseModel):
user = models.ForeignKey(UserProfile, on_delete=models.CASCADE, verbose_name="用戶")
course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name="課程")
class Meta:
verbose_name = "用戶課程"
verbose_name_plural = verbose_name
def __str__(self):
return self.course.name
遷移數(shù)據(jù)庫后, 可以看到如下的表
