第一次编写博文,还有点小紧张!下面是一段关于Django框架的一段博文代码!如有不会的可以留言告诉我哦!
“
1.froms.py
from django import forms
import time
from datetime import datetime
class UserForm(forms.Form):
username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control','placeholder':'请输入用户名'}))
password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control','placeholder':'请输入密码'}))
class RegisterForm(forms.Form):
gender = (
('male', "男"),
('female', "女"),
)
username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control','placeholder':'请输入用户名'}))
password1 = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control','placeholder':'请输入密码'}))
password2 = forms.CharField(label="确认密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control','placeholder':'请再次输入密码'}))
email = forms.EmailField(label="邮箱地址", widget=forms.EmailInput(attrs={'class': 'form-control','placeholder':'请输入邮箱地址'}))
sex = forms.ChoiceField(label='性别', choices=gender)
class ArticleForm(forms.Form):
articletitle = forms.CharField(label='文章标题',max_length=100,widget=forms.TextInput(attrs={'placeholder':'请输入文章标题'}))
articlecontent = forms.CharField(label='文章正文',widget=forms.Textarea(attrs={'placeholder':'请输入文章正文'}))
# articlectime = forms.DateTimeField(label='创建时间',widget=forms.DateTimeInput)
class CommentsForm(forms.Form):
# comments_names = forms.CharField(max_length=128)#用户名称
comments_contents = forms.CharField(label='正文',widget=forms.Textarea(attrs={'placeholder':'请输入评论正文'}))#评论正文
# comments_times = forms.DateTimeField(verbose_name='发布时间',blank=True,null=True)#评论发布时间
2.admin.py
from django.contrib import admin
from . import models
class UserAdmin(admin.ModelAdmin):
list_display=['name','email','sex','c_time']#定在 列表页 中能够显示的字段们
list_display_links=['name','email']#允许被连接到详情页的字段们
search_fields=['name','sex']#允许被搜索的字段
list_filter=['name','email']#右侧添加过滤器
date_hierarchy='c_time'#增加时间过滤器
fieldsets=(
#分组1
(
'基本信息',{
'fields':('name','email','sex'),
}
),
)
class ArticleAdmin(admin.ModelAdmin):
list_display=['title','content','pub_time']#定在 列表页 中能够显示的字段们
list_display_links=['title','content']#允许被连接到详情页的字段们
search_fields=['title','content']#允许被搜索的字段
list_filter=['title']#右侧添加过滤器
date_hierarchy='pub_time'#增加时间过滤器
class CommentsAdmin(admin.ModelAdmin):
list_display=['comments_name','comments_content','comments_time']#定在 列表页 中能够显示的字段们
list_display_links=['comments_name','comments_content']#允许被连接到详情页的字段们
search_fields=['comments_name']#允许被搜索的字段
list_filter=['comments_name']#右侧添加过滤器
date_hierarchy='comments_time'#增加时间过滤器
admin.site.register(models.User,UserAdmin)#注册User类
admin.site.register(models.Article,ArticleAdmin)#注册Article类
admin.site.register(models.Comments,CommentsAdmin)#注册Comments类
3.models.py
from django.db import models
from time import ctime
from django.urls import reverse
#用户表
class User(models.Model):
'''用户表'''
gender = (
('male','男'),
('female','女'),
)
name = models.CharField(verbose_name='用户名',max_length=128,unique=True)#用户名称
password = models.CharField(verbose_name='密码',max_length=256)#用户密码
email = models.EmailField(verbose_name='邮箱',unique=True)#用户邮箱
sex = models.CharField(verbose_name='性别',max_length=32,choices=gender,default='男')#用户性别,默认为男性
c_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)#创建用户的时间
#使对象在后台显示更友好
def __str__(self):
return self.name
# 使后台更易于管理(是中文)
class Meta:
verbose_name = '用户'
verbose_name_plural = verbose_name
ordering = ['-c_time']
#文章表
class Article(models.Model):
title = models.CharField(verbose_name='标题',max_length=100)#文章标题
content = models.TextField(verbose_name='正文',blank=True,null=True)#文章正文
pub_time = models.DateTimeField(verbose_name='发布时间',blank=True,null=True)#文章发布时间
#关联 User 表
auser = models.ForeignKey(User,verbose_name='用户',null=True)#和 User 进行关联一对多的操作
#使对象在后台显示更友好
def __str__(self):
return self.title
class Meta:
verbose_name='博客'
verbose_name_plural = verbose_name
ordering = ["-pub_time"]
#评论表
class Comments(models.Model):
comments_name = models.CharField(verbose_name='评论人',max_length=128,null=True)#用户名称
comments_content = models.TextField(verbose_name='评论文',blank=True,null=True)#评论正文
comments_time = models.DateTimeField(verbose_name='评论时间',blank=True,null=True)#评论发布时间
#关联 User 表
user = models.ManyToManyField(User)#和 User 进行关联多对多的操作
article_c = models.ForeignKey(Article,verbose_name='文章',null=True)
#使对象在后台显示更友好
def __str__(self):
return self.comments_name
class Meta:
verbose_name='评论'
verbose_name_plural=verbose_name
ordering = ['-comments_time']
4.urls.py
from django.conf.urls import url
from . import views
app_name = 'login'
urlpatterns = [
url(r'^$',views.index),#主页(输入127.0.0.1:8000时所返回的主页面)
url(r'^index/',views.index),#主页(当用户退出登录时,退出到的主页面)
url(r'^login/',views.login),#登录页
url(r'^register/',views.register),#注册页
url(r'^logout/',views.logout),#退出登录
url(r'^blog/',views.myblog,name="myblog"),#博文列表
url(r'^blogwen/',views.blogwen),#发布博文
url(r'^comments/(?P<comments_id>[0-9]+)/$',views.comments,name='comments_bowen'),#评论博文
url(r'^article/(?P<article_id>[0-9]+)/$',views.article,name='article'),#用于分页的操作
url(r'^delete/(?P<delete_id>[0-9]+)/$',views.delete_data,name='delete_data'),#删除某个博文的操作
url(r'^myblogs/',views.my_blog,name='my_blog'),#我的博文
]
5.views.py
“`
from django.shortcuts import render,redirect,render_to_response
from . import models
from django.http import HttpResponse,HttpResponseRedirect
from .models import Article,Comments,User
from .froms import UserForm,RegisterForm,ArticleForm,CommentsForm
import time,datetime
import hashlib
from django.shortcuts import render_to_response
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render, get_object_or_404
主页面的返回
def index(request):
return render(request,’login/index.html’)
用户登录
def login(request):
# 通过session来判断用户是否已经登录,如果是登录状态,则不可以重复登录
if request.session.get(‘is_login’,None):
return redirect(‘/index’)
if request.method == "POST":
login_form = UserForm(request.POST)
message = "请检查填写的内容!"
if login_form.is_valid():
username = login_form.cleaned_data['username']
password = login_form.cleaned_data['password']
try:
user = models.User.objects.get(name=username)
if user.password == hash_code(password):
request.session['is_login'] = True
request.session['user_id'] = user.id
request.session['user_name'] = user.name
return redirect('/index/')
else:
message = "密码不正确!"
except:
message = "用户不存在!"
return render(request, 'login/login.html', locals())
login_form = UserForm()
return render(request, 'login/login.html', locals())
用户注册
def register(request):
if request.session.get(‘is_login’, None):
# 登录状态不允许注册。你可以修改这条原则!
return redirect(“/index/”)#render是渲染变量到模板中,而redirect是HTTP中的1个跳转的函数,一般会生成302状态码
if request.method == “POST”:
register_form = RegisterForm(request.POST)#获取到用户提交过来的数据
message = “请检查填写的内容!”
if register_form.is_valid(): # 获取数据是否有效
username = register_form.cleaned_data[‘username’]#获取用户提交过来的username
password1 = register_form.cleaned_data[‘password1’]
password2 = register_form.cleaned_data[‘password2’]
email = register_form.cleaned_data[‘email’]
sex = register_form.cleaned_data[‘sex’]
if password1 != password2: # 判断两次密码是否相同
message = “两次输入的密码不同!”
return render(request, ‘login/register.html’, locals())
else:
same_name_user = models.User.objects.filter(name=username)
if same_name_user: # 用户名唯一
message = ‘用户已经存在,请重新选择用户名!’
return render(request, ‘login/register.html’, locals())
same_email_user = models.User.objects.filter(email=email)
if same_email_user: # 邮箱地址唯一
message = ‘该邮箱地址已被注册,请使用别的邮箱!’
return render(request, ‘login/register.html’, locals())
# 当一切都OK的情况下,创建新用户
new_user = models.User.objects.create()
new_user.name = username
new_user.password = hash_code(password1)
new_user.email = email
new_user.sex = sex
new_user.save()#保存用户的信息到数据库
return redirect('/login/') # 自动跳转到登录页面
register_form = RegisterForm()#实例化RegisterForm
return render(request, 'login/register.html', locals())
用户退出
def logout(request):
if not request.session.get(‘is_login’, None):
# 如果本来就未登录,也就没有登出一说
return redirect(“/index/”)
request.session.flush()
# 或者使用下面的方法
# del request.session[‘is_login’]
# del request.session[‘user_id’]
# del request.session[‘user_name’]
return redirect(“/index/”)
def myblog(request):
all_blog = Article.objects.all().order_by(‘-id’)#获取Article表中的全部数据,根据id的降序排列
# 分页
try:
page = request.GET.get(‘page’, 1)#获取页数,默认为1
except PageNotAnInteger:
page = 1
p = Paginator(all_blog, 3, request=request) #5为每页展示的博客数目
orgs = p.page(page)
return render(request, 'blog/blog.html', {'all_blog': orgs,})
博文
def blogwen(request):
if request.method == ‘POST’:
blogwen_form = ArticleForm(request.POST)
message = “请检查填写的内容!”
if blogwen_form.is_valid():
articletitle = blogwen_form.cleaned_data[‘articletitle’]
articlecontent = blogwen_form.cleaned_data[‘articlecontent’]
new_blogwen = models.Article.objects.create()
new_blogwen.title = articletitle
new_blogwen.content = articlecontent
new_blogwen.pub_time = datetime.datetime.now()#当用户提交博文请求时,默认给一个当前时间戳到数据库
new_blogwen.auser_id = request.session[‘user_id’]
new_blogwen.save()
return redirect(‘/blog/’)
blogwen_form = ArticleForm()
return render(request,’blog/blogwen.html’, locals())
评论
def comments(request,comments_id):
# if request.session.get(‘comments_id’,None):
# return redirect(‘/blog/’)
if request.method == “POST”:
comments_form = CommentsForm(request.POST)#获取到用户提交过来的数据
message = “请检查填写的内容!”
if comments_form.is_valid(): # 获取数据是否有效
comments_contents = comments_form.cleaned_data[‘comments_contents’]#获取用户提交过来的username
#保存数据
# comments = Comments.objects.get(id=comments_id)
# user_list = comments.user.all()
new_comments = models.Comments.objects.create()
# new_comments.id = comments_id
new_comments.comments_name = request.session['user_name']#获取登录时的用户名
new_comments.comments_content = comments_contents
new_comments.comments_time = datetime.datetime.now()#当用户提交博文请求时,默认给一个当前时间戳到数据库
new_comments.article_c_id = comments_id
new_comments.save()
return redirect('/blog/')
comments_form = CommentsForm()
return render(request,'blog/comments.html',{'comments_form':comments_form,'comments_id':comments_id})
hash
def hash_code(s, salt=’mysite’):# 加点盐
h = hashlib.sha256()
s += salt
h.update(s.encode()) # update方法只接收bytes类型
return h.hexdigest()
def page(request):
page = Article.objects.all()
return render(request,’blog/blog.html’,{‘page’:page})
分页
def article(request,article_id):
article_all = Article.objects.get(id=article_id)
# comments_all = Comments.objects.get(id=article_id)
article = get_object_or_404(Article,id=article_id)
#正向查询
# comments = Comments.objects.get(id=article_id)
# user_list = comments.user.all()
article_c = Article.objects.get(id=article_id)
comments_list = article_c.comments_set.all()
return render(request,"blog/article.html",locals())
删除
def delete_data(request,delete_id):
article_u = Article.objects.get(id=delete_id)
auser = article_u.auser
if auser.name == request.session[‘user_name’]:
dels = Article.objects.get(id=delete_id)
dels.delete()
return HttpResponseRedirect('/blog/')
else:
return HttpResponse('对不起,你没有删除权限')
# return HttpResponseRedirect('/blog/')
我的博文
def my_blog(request):
#一对多的关联
auser = User.objects.get(name=request.session[‘user_name’])
article_list = auser.article_set.all()
# article_all = article_list.order_by('-id')
# all_blog = Article.objects.get(auser_id=request.session['user_id']).order_by('-id')
# 分页
try:
page = request.GET.get('page', 1)#获取页数,默认为1
except PageNotAnInteger:
page = 1
p = Paginator(article_list, 3, request=request) #5为每页展示的博客数目
orgs = p.page(page)
return render(request,'blog/myblogs.html',{'article_list':article_list})