如果你对中医感兴趣欢迎留言讨论,觉得我的内容对你有帮助的话,能够请我喝一杯沪上阿姨不禁万分感谢。
内容简介
本章介绍Django搭建中医网站项目平台前端建设之资讯模块的数据交互的内容。其中由于代码量较大,因此部分模块代码举例说明,自己根据实际需要进行修改即可。
创建新闻内容应用模块
进入文件根目录执行命令创建应用
cd TCM_Web
python manage.py startapp article
将创建好的应用文件夹移动到目录的apps下即可
配置新闻应用模块
在settings.py文件中修改
INSTALLED_APPS = [...# 添加文章应用'article',
编写应用中的文件实现数据内容定义
不需要修改该的文件
- admin.py 这个我们使用xadmin代替的原有版本的admin,因此这个文件不需要修改该
- apps.py 应用的配置文件,不需要动
- test.py 测试执行脚本,不需要动
- models.py 这里不创建任何内容所以无视
views.py
通过Views视图的方式实现前端提交的事件后台通过API接口交互的方式进行数据读取,传输到前台进行展示
1.基础数据信息
import random
import requests
from django.utils import timezone
from urllib import parse
from django.shortcuts import render
from urllib.parse import urljoin
from django.http import HttpResponse
from django.core.mail import send_mail
from home.models import *
from user.models import *
import json
from django.views.generic.base import View# 设置每页显示数据的最大条数
PAGESIZE = 10# 将之前做好的API接口数据进行拼接 根据实际需要进行删减
url_name = 'http://127.0.0.1' # 部署到服务器上修改成你的IP地址
ArticleCategoryList = url_name + "/ArticleCategoryList/"
ArticleItemList = url_name + "/ArticleItemList/"
ArticleTagList = url_name + "/ArticleTagList/"
ArticleInfoList = url_name + "/ArticleInfoList/"
ArticleContentList = url_name + "/ArticleContentList/"
ArticleIndexInfoList = url_name + "/ArticleIndexInfoList/"
ArticleChannelInfoList = url_name + "/ArticleChannelInfoList/"
DataCategoryList = url_name + "/DataCategoryList/"
DataSortList = url_name + "/DataSortList/"
WMDiseaseTypeList = url_name + "/WMDiseaseTypeList/"
WMDiseaseInfoList = url_name + "/WMDiseaseInfoList/"
WMDataInfoList = url_name + "/WMDataInfoList/"
TCMDiseaseTypeList = url_name + "/TCMDiseaseTypeList/"
TCMDiseaseInfoList = url_name + "/TCMDiseaseInfoList/"
TCMDataInfoList = url_name + "/TCMDataInfoList/"
TCMTermsTypeList = url_name + "/TCMTermsTypeList/"
TCMTermsInfoList = url_name + "/TCMTermsInfoList/"
DataInfoTermsList = url_name + "/DataInfoTermsList/"
TCMCropsTypeList = url_name + "/TCMCropsTypeList/"
TCMCropsInfoList = url_name + "/TCMCropsInfoList/"
DataInfoCropsList = url_name + "/DataInfoCropsList/"
CTFTypeList = url_name + "/CTFTypeList/"
CTFInfoList = url_name + "/CTFInfoList/"
DataInfoCTFList = url_name + "/DataInfoCTFList/"
TCMFoodSourceList = url_name + "/TCMFoodSourceList/"
TCMFoodTypeList = url_name + "/TCMFoodTypeList/"
TCMFoodInfoList = url_name + "/TCMFoodInfoList/"
DataInfoTCMFoodList = url_name + "/DataInfoTCMFoodList/"
OtherProjectList = url_name + "/OtherProjectList/"
AdvertisingBannerList = url_name + "/AdvertisingBannerList/"
2.数据读取方式
通过python的爬虫思路可以使用request方式进行API数据读取,使用json进行数据的解析传输
"""使用request方法进行数据获取"""
def GetData(url_, data=None):try:if data:data = '?' + parse.urlencode(data)url = urljoin(url_, data)html = requests.get(url)else:html = requests.get(url_)ReturnData = json.loads(html.text) # 将获取的字符串数据数据处理成json格式except Exception as e:ReturnData = {'result': e, 'code': e, 'msg': '请求api数据错误!', 'data': '{}', 'redirect_url': ''}return ReturnData
3.配置全局变量
这里要在settings.py中配置对应内容增加
TEMPLATES = [{......'OPTIONS': {'context_processors': [......'article.views.GlobalVariable', # 新增全局变量],}},},
]
views.py
"""配置全局加载变量数据即无论打开那个网页都会加载的数据内容"""
def GlobalVariable(request):category_list = GetData(ArticleCategoryList) # 一级类别items_list1 = GetData(ArticleItemList)[:8] # 健康类新闻栏目较多拆成3列items_list2 = GetData(ArticleItemList)[8:16] # 健康类新闻栏目较多拆成3列items_list3 = GetData(ArticleItemList)[16:] # 健康类新闻栏目较多拆成3列items_list = GetData(ArticleItemList) # 健康类数据栏目tags_list = random.sample(GetData(ArticleTagList), 5) # tagproject_list = GetData(OtherProjectList) # 其他工程banner_list = GetData(AdvertisingBannerList) # banner轮播user = request.user # 检测当前访问用户ArticleIndexInfo = GetData(ArticleIndexInfoList) # 获取主页展示的新闻内容数据return locals()
4.网站主页的数据传输展示和订阅功能
"""主页的功能和index的文章文章列表"""
def HomeIndex(request):# 用户信息提交数据反馈功能,使用邮件自动回复实现,这里需要js实现url访问提交,暂未实现(对应html中class="newsletter")if request.method == 'POST':email = request.POST.get('email')subject = "感谢您对Mr.数据杨中医网站的数据的订阅"message = "后续会给您发送订阅邮件"SubscribeEmail_data = SubscribeEmail()SubscribeEmail_data.email = emailSubscribeEmail_data.save()send_mail(subject, message, '33034782@qq.com', [email], fail_silently=False)return HttpResponse("感谢您的订阅")# 加载主页新闻数据列表信息ArticleIndexInfo = GetData(ArticleIndexInfoList)return render(request, 'WebStation/web_home_index.html', locals())
5.不同类别的新闻数据的传输展示
"""新闻类别channel的文章列表"""
def ArticleChannelList(request):CategoryName = request.GET.get('ChannelCategory')ItemName = request.GET.get('ChannelItem')Page = int(request.GET.get('page', 1))data = {"item__item_name": ItemName, "page": Page, "ordering": '-info_slug', }article_list = GetData(ArticleChannelInfoList, data)return render(request, 'WebStation/web_article_channel.html', locals())
6.新闻Tag标签的数据传输展示
"""新闻tag标签列表"""
def ArticleTagInfoList(request):TagName = request.GET.get('tag_name')Page = int(request.GET.get('page', 1))data = {"tags__tag_name": TagName, "page": Page}article_list = GetData(ArticleInfoList, data)["results"]return render(request, 'WebStation/web_article_tag.html', locals())
7.通用文章详情的数据传视展示
"""通用文章详情"""
def ArticleDetail(request):article_type = request.GET.get('article_type') # 获取主页文章类型执行对应数据库InfoSlug = request.GET.get('info_slug') # 从前端页面获取文章的info_slug唯一标识article_type_dict = {"index": ArticleIndexInfoList, # 主页文章"channel": ArticleChannelInfoList, # 频道文章"all":ArticleInfoList # 全部文章}url_ = article_type_dict[article_type]url_ = urljoin(url_, InfoSlug) # 拼接API接口可以返回文章详细内容的linkarticle_info = GetData(url_) # 通过request的方式获取文章的详情信息key_words = eval(article_info["key_words"]) # 提取关键词字段生成可以遍历的list# 记录用户阅读文章信息try:read_article = UserNewsRead()read_article.username_id = request.user.idread_article.article_slug = InfoSlugread_article.add_time = timezone.now()read_article.save()except:pass# 判断用户是否收藏该文章返回结果,未收藏为空has_fav = UserNewsFav.objects.filter(username_id=request.user.id, article_slug=InfoSlug)return render(request, 'WebStation/web_article_detail.html', locals())
8.知识库数据栏目数据传输展示
"""知识库数据每个栏目列表"""
def DataInfoList(request):ChannelItem = request.GET.get('ChannelItem')# 知识库的列表信息,这里根据后台数据管理的内容增减 info_list_dict,info_type_dictinfo_list_dict = {"中医辞典": DataInfoTermsList,"中医药材": DataInfoCropsList,"中国传统节日": DataInfoCTFList,"药食同源": DataInfoTCMFoodList,"西医疾病": WMDataInfoList,"中医疾病": TCMDataInfoList,}info_type_dict = {"中医辞典": TCMTermsTypeList,"中医药材": TCMCropsTypeList,"中国传统节日": CTFTypeList,"药食同源": TCMFoodTypeList,"西医疾病": WMDiseaseTypeList,"中医疾病": TCMDiseaseTypeList,}info_url = info_list_dict[ChannelItem]type_url = info_type_dict[ChannelItem]Page = int(request.GET.get('page', 1))data_info_list = GetData(info_url)["results"] # 获取数据对应类别内容的列表data_type_list = GetData(type_url)["results"] # 获取数据对应类别的列表return render(request, 'WebStation/web_data_info.html', locals())
9.每个知识库详情页的数据传输展示
"""知识库数据每个栏目列表"""
def DataInfoList(request):ChannelItem = request.GET.get('ChannelItem')# 知识库的列表信息,这里根据后台数据管理的内容增减 info_list_dict,info_type_dictinfo_list_dict = {"中医辞典": DataInfoTermsList,"中医药材": DataInfoCropsList,"中国传统节日": DataInfoCTFList,"药食同源": DataInfoTCMFoodList,"西医疾病": WMDataInfoList,"中医疾病": TCMDataInfoList,}info_type_dict = {"中医辞典": TCMTermsTypeList,"中医药材": TCMCropsTypeList,"中国传统节日": CTFTypeList,"药食同源": TCMFoodTypeList,"西医疾病": WMDiseaseTypeList,"中医疾病": TCMDiseaseTypeList,}info_url = info_list_dict[ChannelItem]type_url = info_type_dict[ChannelItem]Page = int(request.GET.get('page', 1))data_info_list = GetData(info_url)["results"] # 获取数据对应类别内容的列表data_type_list = GetData(type_url)["results"] # 获取数据对应类别的列表return render(request, 'WebStation/web_data_info.html', locals())
10.知识库每个栏目类型的传输展示
"""知识库数据每个栏目列表"""
def DataInfoList(request):ChannelItem = request.GET.get('ChannelItem')# 知识库的列表信息,这里根据后台数据管理的内容增减 info_list_dict,info_type_dictinfo_list_dict = {"中医辞典": DataInfoTermsList,"中医药材": DataInfoCropsList,"中国传统节日": DataInfoCTFList,"药食同源": DataInfoTCMFoodList,"西医疾病": WMDataInfoList,"中医疾病": TCMDataInfoList,}info_type_dict = {"中医辞典": TCMTermsTypeList,"中医药材": TCMCropsTypeList,"中国传统节日": CTFTypeList,"药食同源": TCMFoodTypeList,"西医疾病": WMDiseaseTypeList,"中医疾病": TCMDiseaseTypeList,}info_url = info_list_dict[ChannelItem]type_url = info_type_dict[ChannelItem]Page = int(request.GET.get('page', 1))data_info_list = GetData(info_url)["results"] # 获取数据对应类别内容的列表data_type_list = GetData(type_url)["results"] # 获取数据对应类别的列表return render(request, 'WebStation/web_data_info.html', locals())
11.用户阅读记录数据的传输和展示
"""知识库数据每个栏目列表"""
def DataInfoList(request):ChannelItem = request.GET.get('ChannelItem')# 知识库的列表信息,这里根据后台数据管理的内容增减 info_list_dict,info_type_dictinfo_list_dict = {"中医辞典": DataInfoTermsList,"中医药材": DataInfoCropsList,"中国传统节日": DataInfoCTFList,"药食同源": DataInfoTCMFoodList,"西医疾病": WMDataInfoList,"中医疾病": TCMDataInfoList,}info_type_dict = {"中医辞典": TCMTermsTypeList,"中医药材": TCMCropsTypeList,"中国传统节日": CTFTypeList,"药食同源": TCMFoodTypeList,"西医疾病": WMDiseaseTypeList,"中医疾病": TCMDiseaseTypeList,}info_url = info_list_dict[ChannelItem]type_url = info_type_dict[ChannelItem]Page = int(request.GET.get('page', 1))data_info_list = GetData(info_url)["results"] # 获取数据对应类别内容的列表data_type_list = GetData(type_url)["results"] # 获取数据对应类别的列表return render(request, 'WebStation/web_data_info.html', locals())
12.用户收藏功能数据的传输展示
"""用户收藏信息列表"""
class UserFavArticleListView(View):def get(self, request):if not request.user.is_authenticated:return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')user = UserNewsFav.objects.filter(username_id=request.user.id).values("article_slug").order_by("article_slug").distinct()article_data = []for i in user:articles_url = ArticleInfoList + i["article_slug"]article_list = GetData(articles_url)article_data.append(article_list)article_list = article_data[-10:]return render(request, 'WebStation/web_article_channel.html', locals())
urls.py配置
在urlpatterns注册我们的url信息
from django.contrib import admin
from django.urls import path, re_path, include
from article.views import *
from user.views import *
from home.views import *
from django.views.decorators.csrf import csrf_exempt
import xadmin
from xadmin.plugins import xversionxadmin.autodiscover() # xversion模块自动注册需要版本控制的 Model
xversion.register_models()
urlpatterns = [......# 主页详情列表和详情内容re_path(r'^$', HomeIndex, name='HomeIndex'),# 文章详情path('ArticleDetail/', ArticleDetail, name='ArticleDetail'),# 新闻内容每个频道详情列表和详情内容path('ArticleChannelList/', ArticleChannelList, name='ArticleChannelList'),path('ArticleTagInfoList/', ArticleTagInfoList, name='ArticleTagInfoList'),# 知识库内容每个类别的列表和详情内容path('DataInfoList/', DataInfoList, name='DataInfoList'),path('DataInfoDetail/', DataInfoDetail, name='DataInfoDetail'),path('DataTypeList/', DataTypeList, name='DataTypeList'),# 用的浏览记录和收藏记录path('UserFavArticleList/', UserFavArticleListView.as_view(), name="UserFavArticleList"), # 文章收藏path('UserReadArticleList/', UserReadArticleListView.as_view(), name="UserReadArticleList"), # 文章浏览
]