写在前面
本期内容:基于Django与HTML的简单新闻发布系统。
项目需求:Python+Django
项目简介
本期博主将带着大家用Django完成一个简单的新闻发布系统,该新闻发布系统具有“登录界面”,“注册界面”,“新闻界面”以及“后台界面”。
项目框架
- 用户注册界面:用户可以注册自己的信息,用于登录系统。
- 用户登录界面:登录系统的界面,验证用户的登录信息是否合法。
- 新闻信息界面:展示新闻的信息。
- 后台管理界面:管理员可以发布新闻,修改和删除新闻信息。
实验内容
安装依赖库
- Django(如未安装django库,可以运行以下命令进行安装)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple django • 1
1.创建项目
- 使用以下命令新建一个名为newsProject的项目
django-admin startproject newsProject • 1
- 进入newsProject项目,使用以下命令新建一个名为news的app
cd newsProject django-admin startapp news
2.系统配置
- 双击打开newsProject文件夹中的settings.py文件
- 在INSTALLED_APPS中添加news
- 双击打开"newsProject"文件夹下的"urls.py"文件,配置项目的导航路径
from django.contrib import admin from django.urls import path from news import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.home), path('regist/', views.regist), path('login/', views.login), path('logout/', views.logout), path('article/', views.article), path('<int:id>/', views.detail, name='detail'), ]
注意代码里的views可能会爆红,这是因为我们还没有配置"views"视图文件,下面就让我们一起来配置一下吧~
3.配置视图文件
双击打开"news"目录下的"views.py"文件,配置项目的视图函数
from django.shortcuts import render, redirect from django.http import HttpResponse, Http404 from .models import Article from django.contrib import auth from django import forms from django.contrib.auth.models import User class UserForm(forms.Form): username = forms.CharField(label='用户名', max_length=100) password = forms.CharField(label='密 码', widget=forms.PasswordInput()) # 主界面 def home(request): return render(request, 'home.html') # 用户注册界面 def regist(request): if request.method == 'POST': uf = UserForm(request.POST) # 包含用户名和密码 if uf.is_valid(): # 获取表单数据 username = uf.cleaned_data['username'] # cleaned_data类型是字典,里面是提交成功后的信息 password = uf.cleaned_data['password'] # 添加到数据库 registAdd = None try: registAdd = User.objects.create_user(username=username, password=password) return render(request, 'regists.html', {'registAdd': registAdd}) except: return render(request, 'regists.html', {'registAdd': registAdd, 'username': username}) else: # 如果不是post提交数据,就不传参数创建对象,并将对象返回给前台,直接生成input标签,内容为空 uf = UserForm() return render(request, 'regist.html', {'uf': uf}) def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') match = auth.authenticate(username=username, password=password) # 用户认证 if match is not None: # 如果数据库里有记录(即与数据库里的数据相匹配或者对应或者符合) auth.login(request, match) # 登陆成功 return redirect('/', {'user': match}) # 跳转--redirect指从一个旧的url转到一个新的url else: # 数据库里不存在与之对应的数据 return render(request, 'login.html', {'login_error': '用户名或密码错误'}) # 登录失败 return render(request, 'login.html') def logout(request): auth.logout(request) return render(request, 'home.html') def article(request): article_list = Article.objects.all() # QuerySet是一个可遍历结构,包含一个或多个元素,每个元素都是一个Model实例 # QuerySet类似于Python中的list,list的一些方法QuerySet也有,比如切片,遍历。 # 每个Model都有一个默认的manager实例,名为objects,QuerySet有两种来源:通过manager的方法得到、通过QuerySet的方法得到。mananger的方法和QuerySet的方法大部分同名,同意思,如filter(),update()等,但也有些不同,如manager有create()、get_or_create(),而QuerySet有delete()等 return render(request, 'article.html', {'article_list': article_list}) def detail(request, id): try: article = Article.objects.get(id=id) # print type(article) except Article.DoesNotExist: raise Http404 return render(request, 'detail.html', locals())
该段代码是一个基于Django框架的用户注册和登录功能实现。主要包含以下几个函数:
home(request)
: 主界面,渲染home.html模板。- regist(request): 用户注册界面。如果请求为POST方法,从表单中获取用户名和密码,将其添加到数据库中创建新用户。如果注册成功,渲染regists.html模板并传递注册成功的信息。如果注册失败,渲染regists.html模板并传递错误信息。如果请求为GET方法,直接渲染regist.html模板。
- login(request): 用户登录界面。如果请求为POST方法,从表单中获取用户名和密码,使用auth.authenticate()函数进行用户认证。如果认证成功,调用auth.login()函数进行登录并重定向到主页。如果认证失败,渲染login.html模板并传递错误信息。
- logout(request): 用户注销功能。调用auth.logout()函数进行注销,并渲染home.html模板。
- article(request): 文章列表页面。从数据库中获取所有文章对象,并渲染article.html模板并传递文章列表。
- detail(request, id): 文章详情页面。根据文章的id从数据库中获取对应的文章对象,并渲染detail.html模板并传递文章对象。
注意:此时的"Article"会爆红,因为我们还没有配置"models.py"模型文件哦
4.配置模型文件
接下来我们就来配置"news"的"models.py"模型文件吧
from django.db import models class Article(models.Model): title = models.CharField('标题', max_length=256) content = models.TextField('内容') pub_date = models.DateTimeField('发表时间', auto_now_add=True, editable=True) update_time = models.DateTimeField('更新时间', auto_now=True, null=True) def __str__(self): return self.title
该代码段定义了一个名为Article的模型类,用于表示文章对象。
该模型类继承自Django提供的models.Model基类,以便使用Django的数据库功能。
模型类包含以下几个字段:
- title: 标题字段,使用CharField类型,最大长度为256字符。
- content: 内容字段,使用TextField类型,可以存储较长的文本内容。
- pub_date: 发表时间字段,使用DateTimeField类型,自动记录发表时间,并设置为只读(不可编辑)。
- update_time: 更新时间字段,使用DateTimeField类型,自动记录最后更新时间,并在更新时进行更新,允许为空。
模型类还定义了一个__str__()方法,用于在对象被打印或字符串表示时返回标题字段的值。
该模型类的目的是在数据库中创建一个名为Article的表,用于存储文章的相关信息,如标题、内容、发表时间和更新时间等。
通过使用该模型类,可以方便地对文章对象进行创建、查询、更新和删除操作。
5.配置管理员文件
最后我们需要配置一下"news"里的"admin.py"文件
from django.contrib import admin from news.models import Article class ArticleAdmin(admin.ModelAdmin): list_display = ('title','pub_date', 'update_time',) admin.site.register(Article, ArticleAdmin)
这段代码是在Django的admin.py文件中注册一个模型(Model)并配置相应的管理选项。
首先,我们导入了admin模块,并导入了Article模型(假设该模型定义在news.models文件中)。
然后,我们定义了一个名为ArticleAdmin的类,继承自admin.ModelAdmin。该类用于配置Article模型在Django admin后台的显示和操作选项。
在这个类中,我们设置了list_display属性,它是一个包含模型字段名称的元组。这个属性指定了在Django admin后台中列表视图显示的字段。在这个例子中,我们指定了’title’(标题)、‘pub_date’(发布日期)和’update_time’(更新时间)。
最后,我们调用admin.site.register()方法,将Article模型和ArticleAdmin类进行注册。这告诉Django admin后台要管理Article模型,并使用ArticleAdmin类中指定的配置选项。
通过这段代码,您就可以在Django admin后台中管理Article模型,并可以根据设置的list_display属性在列表视图中显示指定的字段。
Web实战丨基于Django与HTML的新闻发布系统: