django实现自定分页功能的留言板

利用django框架实现带表单验证加自定义分页功能的留言板

views.py

 1 from django.shortcuts import render,redirect,HttpResponse
 2 from guest_book import models
 3 from .forms import GuestForm
 4 import json
 5 
 6 def guestbook(request,pid):
 7     ret = {'status': True, 'error': None, 'data': None}
 8     if request.method == 'GET':
 9         if pid == None:
10             pid = 1
11         current_page = int(pid)
12         # 起始索引,(当前页码-1)* 每页显示条数
13         start = (current_page - 1) * 10
14         end = current_page * 10
15         # 从数据库取值的范围
16         guest_list = models.GuestBook.objects.all()[start:end]
17         total_count = models.GuestBook.objects.all().count()
18         # 总条数除以每页显示10条,得到页数,余数不等于0,另起一页
19         total_page, a = divmod(total_count, 10)
20         if a != 0:
21             total_page += 1
22 
23         # 显示的页码数
24         page_list = []
25         # 如果当前页为第一页,上一页则不再跳转
26         if current_page == 1:
27             page_list.append("<a href='javascript:void(0);' style='text-decoration:none'><上一页</a>")
28         else:
29             page_list.append("<a href='/guestbook/%s'><上一页</a>"% (current_page - 1, ))
30 
31         global page_start,page_end
32         if total_page <= 11:
33             page_start = 1
34             page_end = total_page
35         else :
36             if current_page <= 6:
37                 page_start = 1
38                 page_end = 11 + 1
39             elif current_page > 6:
40                 # 生成首页 和 ...
41                 page_list.append("<a href='/guestbook/%s'>1</a>" % (1,))
42                 page_list.append("<a href='javascript:void(0);'>...</a>")
43 
44                 if total_page - current_page >= 5:
45                     page_start = current_page - 3
46                     page_end = current_page + 4
47                 else:
48                     page_start = total_page - 8
49                     page_end = total_page + 1
50 
51                 # 接上,最后一页为当前页+6,但不能让他一直+6,当最后一页的页码数大于最大页码数时,让最后一页变成当前页,不再加了
52                 if page_end >= total_page:
53                     page_end = current_page + 1
54                 if current_page + 5 >= total_page:
55                     page_end = total_page + 1
56 
57             # 根据不同的起始页和终止页生成相应的页码
58             for page in range(page_start, page_end):
59                 # 当前页增加样式
60                 if page == current_page:
61                     page_list.append("<a class='active' href='/guestbook/%s'>%s</a>"% (page, page))
62                 else:
63                     page_list.append("<a href='/guestbook/%s'>%s</a>"% (page, page))
64             # 生成 ... 和 尾页
65             if current_page > 6 and (total_page - current_page >= 6):
66                 page_list.append("<a href='javascript:void(0);'>...</a>")
67                 page_list.append("<a href='/guestbook/%s'>%s</a>" % (total_page, total_page))
68 
69             # 如果当前页为总页数,下一页则不再跳转
70             if current_page == total_page:
71                 page_list.append("<a href='javascript:void(0);' style='text-decoration:none'>下一页></a>")
72             else:
73                 page_list.append("<a href='/guestbook/%s'>下一页></a>" % (current_page + 1,))
74 
75             page_list = ''.join(page_list)
76 
77         return render(request,'guestbook.html',{'guest_list':guest_list,'total_count':total_count, 'page_list':page_list})
78 
79     elif request.method == "POST":
80         obj = GuestForm(request.POST)
81         print (request.POST)
82         if obj.is_valid():
83             models.GuestBook.objects.create(**obj.cleaned_data)
84         else:
85             res_str = obj.errors.as_json()  # res_str是一个字符串
86             ret['status'] = False
87             ret['error'] = res_str
88         return HttpResponse(json.dumps(ret))

guestbook.html

运用kindeditor富文本框。

  1 {% load static %}
  2 <!DOCTYPE html>
  3 <html lang="en">
  4 <head>
  5     <meta charset="UTF-8">
  6     <title>Title</title>
  7     <link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
  8 
  9     <style>
 10         .guestbook {
 11             margin: 50px auto;
 12             background-color: lightblue;
 13             width: 900px;
 14             height: 2200px;
 15 
 16         }
 17         .header {
 18             border-bottom: 2px solid white;
 19             width: 800px;
 20             height: 150px;
 21             margin: 0 auto;
 22 
 23 
 24         }
 25         .header span {
 26             font-size: 22px;
 27             color: white;
 28             display: inline-block;
 29             margin-top: 100px;
 30 
 31         }
 32         .master_say {
 33             width: 800px;
 34             height: 150px;
 35             margin: 0 auto;
 36         }
 37         .master_say span {
 38             font-size: 16px;
 39             color: white;
 40             display: inline-block;
 41             margin-top: 20px;
 42 
 43         }
 44         .message {
 45             width: 800px;
 46             margin: 0 auto;
 47 
 48         }
 49         .message span {
 50             font-size: 16px;
 51             color: white;
 52             display: inline-block;
 53         }
 54         .form {
 55             margin: 0;
 56         }
 57         .form textarea {
 58             display: block;
 59             visibility:hidden;
 60             width: 800px;
 61         }
 62         .form input {
 63             display: inline-block;
 64             width: 200px;
 65             height: 30px;
 66         }
 67 
 68         .commit input {
 69             margin-top: 10px;
 70             height: 25px;
 71             width: 80px;
 72             text-align: center;
 73             line-height: 25px;
 74             border-radius: 5px;
 75             font-size: 17px;
 76             background-color: white;
 77             color: lightblue;
 78         }
 79 
 80         .message_history {
 81             width: 800px;
 82             height: 1000px;
 83         }
 84         .message_history .header {
 85             border-bottom: 2px solid white;
 86             height: 100px;
 87         }
 88         .message_history .header span {
 89             margin-top: 60px;
 90             font-size: 17px;
 91         }
 92         .message_history li {
 93             height: 130px;
 94             border-bottom: 1px solid white;
 95 
 96         }
 97 
 98         .message_history p:nth-child(1){
 99 
100             margin-top: 10px;
101             height: 20px;
102             width: auto;
103         }
104         .message_history p:nth-child(2){
105             margin-top: 10px;
106 
107         }
108         .message_history p:nth-child(3){
109             margin-top: 30px;
110             color: #337FE5;
111             height: 20px;
112             width: auto;
113 
114         }
115         .pagination {
116             width: auto;
117             height: 30px;
118             margin: 30px auto;
119             text-align: center;
120         }
121         .pagination a {
122             display: inline-block;
123             height: 30px;
124             width: 40px;
125             line-height: 30px;
126             margin: auto 5px;
127         }
128         .pagination a:nth-child(1){
129             width: 60px;
130         }
131         .pagination a:nth-last-child(1){
132             width: 60px;
133         }
134         .active {
135             background-color: white;
136         }
137 
138     </style>
139 </head>
140 
141 <body>
142 
143     <div class="guestbook">
144         <div class="header">
145             <span >留言簿</span>
146         </div>
147         <div class="master_say">
148             <span>主人寄语</span>
149             <br>
150             <span>欢迎光临我的空间,请留下您想对我说的话。</span>
151         </div>
152         <div class="message">
153             <span>发表您的留言:</span>
154             <form method="POST" class="form" id="form">
155                 {% csrf_token %}
156                 <textarea name="content" id="content" ></textarea>
157                 <br>
158                 <span>留下您的大名:</span>
159                 <br>
160                 <input type="text" name="username" id="username">
161                 <div class="commit">
162                     <input type="button" value="提交" id="btn">
163                 </div>
164             </form>
165             <div class="message_history">
166                 <div class="header">
167                     <span>留言({{ total_count }})</span>
168                 </div>
169                 <ul>
170                      {% for row in guest_list %}
171                          <li>
172                              <p>{{ row.username }}</p>
173                              <p>{{ row.content | safe }}</p>
174                              <p>{{ row.date | date:'Y-m-d H:i:s' }}</p>
175                          </li>
176                      {% endfor %}
177                 </ul>
178                 <div class="pagination">
179                         {{ page_list | safe }}
180                 </div>
181             </div>
182         </div>
183 
184 
185     </div>
186     <script src="{% static 'js/jquery-1.8.3.min.js'%}"></script>
187     <script src="{% static 'plugins/kind-editor/kindeditor-min.js'%}"></script>
188     <script>
189         $(function () {
190             initKindEditor();
191 
192         function initKindEditor() {
193             var kind = KindEditor.create('#content', {
194                 resizeType : 0,
195                 allowImageUpload : false,
196                 items : [
197                     'fontname', '|','fontsize', '|', 'forecolor','|', 'hilitecolor', 'bold', 'italic', 'underline',
198                     'removeformat', '|', 'justifyleft', 'justifycenter', 'justifyright', 'insertorderedlist',
199                     'insertunorderedlist', '|', 'emoticons', 'image', 'link'],
200                 afterBlur: function(){this.sync();}
201                 // 这句的作用是,同步KindEditor的值到textarea文本框中
202                 //这样才能取到文本框的中值
203             });
204         }
205         $('#btn').click(function () {
206             $.ajax({
207                 url: "guestbook.html",
208                 data: $('#form').serialize(),
209                 type: 'POST',
210                 success: function (arg) {
211                     $('.error-msg').remove();
212                     // 将后台返回的字符串解析成JSON对象
213                     var obj = JSON.parse(arg);
214                    // obj ---->{status: false, error: "{"username": [{"message": "\u5927\", "code": "required"}]}", data: null}
215                     if (!obj.status) {
216                         var error_obj = JSON.parse(obj.error);
217                         console.log(error_obj);
218                         // error_obj----> 0:{message: "内容不可以为空哦!", code: "required"}
219 
220                         // 遍历error_obj中的对象,分别在其后面添加一个span标签,并将错误信息设置为其属性
221                         $.each(error_obj, function (k, v) {
222                             var tag = document.createElement('span');
223                             tag.className = 'error-msg';
224                             tag.innerHTML = v[0].message;
225                             $("textarea[name='" + k + "']").after(tag);
226                             $("input[name='" + k + "']").after(tag);
227                         })
228                     } else {
229                         // 刷新当前页面
230                         location.href = "guestbook.html"
231                     }
232                 }
233 
234             })
235         });
236         });
237 
238 
239     </script>
240 </body>
241 </html>
View Code

models.py

 1 from django.db import models
 2 
 3 class GuestBook(models.Model):
 4     username = models.CharField(max_length=32, null=None)
 5     content = models.CharField(max_length=255, null=None)
 6     date = models.DateTimeField(auto_now_add=True)
 7 
 8     class Meta:
 9         # 根据日期倒叙排序
10         ordering = ['-date']

forms.py

# -*- coding=utf-8 -*-
from django import forms
class GuestForm(forms.Form):
    username = forms.CharField(error_messages={'required': '大名不可以为空哦!'})
    content = forms.CharField(error_messages={'required': '内容不可以为空哦!'})

urls.py

# -*- coding=utf-8 -*-
from django.conf.urls import url
from guest_book import views
urlpatterns = [
    url(r'^guestbook/(?P<pid>\d+)*',views.guestbook),

]

效果:

始终保留首页和尾页。

简单的表单验证功能。

'源码在这里'

希望大家给出宝贵意见和建议,谢谢!

猜你喜欢

转载自www.cnblogs.com/zhujunzoe/p/9103162.html