貌似Django從版本1.6開始就放棄了對自帶的comments的使用,具體原因未查,但是現在使用Django的內部的模塊也可以實現評論功能,那就是借助于forms模塊,下面是我的一個小例子。
環境準備
•操作系統 : windows 7 64 位旗艦版
•IDE: PyCharm 2016.1
•Python :2.7.11
•Django :1.9.6
設計
所謂設計,就是指我們將要實現的評論功能將要涉及的底層模型。我這里簡單的設計如下,大家按照自己的想法,可以隨意的設置,我這里的設置見models.py文件:
from __future__ import unicode_literalsfrom django.contrib import adminfrom django.db import modelsfrom django import forms# Create your models here.TOPIC_CHOICES = ( ('level1','Bad'), ('level2','SoSo'), ('level3','Good'),)class RemarkForm(forms.Form): subject = forms.CharField(max_length=100,label='Mark Board') mail = forms.EmailField(label='email') topic = forms.ChoiceField(choices=TOPIC_CHOICES,label='choose one topic') message = forms.CharField(label='content for mark',widget=forms.Textarea) cc_myself = forms.BooleanField(required=False,label='watch this tie')class Remark(models.Model): subject = models.CharField(max_length=100) mail = models.EmailField() topic = models.CharField(max_length=100) message = models.CharField(max_length=300) cc_myself = models.BooleanField() def __unicode__(self): return self.subject class Meta: ordering = ['subject']admin.site.register([Remark,])大家都看到了,models.py文件里面多了一個forms 的子類,這回因為我們的操作涉及到了網頁表單,這樣的話,最好給每一個model類創建一個Form表單類,方便從表單中獲取cleaned_data。
url映射文件urls.py
這個文件比較的簡單,如下:
"""FormRelative URL ConfigurationThe `urlpatterns` list routes URLs to views. For more information please see: https://docs.djangoproject.com/en/1.9/topics/http/urls/Examples:Function views 1. Add an import: from my_app import views 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')Class-based views 1. Add an import: from other_app.views import Home 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))"""from django.conf.urls import urlfrom django.contrib import adminfrom app.views import *urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^remark/$',reamark),]視圖層views.py
這個文件決定了映射文件對應的展示的視圖,所以比較的重要。
from django.shortcuts import renderfrom app.models import *from django.http import *# Create your views here.# subject = models.CharField(max_length=100)# mail = models.EmailField()# topic = models.CharField(max_length=100)# message = models.CharField(max_length=300)# cc_myself = models.BooleanField()def reamark(request): if request.method =="POST": form = RemarkForm(request.POST) if form.is_valid(): myremark = Remark() myremark.subject=form.cleaned_data['subject'] myremark.mail = form.cleaned_data['mail'] myremark.topic = form.cleaned_data['topic'] myremark.message = form.cleaned_data['message'] myremark.cc_myself = form.cleaned_data['cc_myself'] myremark.save() # return HttpResponse("Publish Success!") else: form = RemarkForm() ctx = { 'form':form, 'ties':Remark.objects.all() } return render(request,'message.html',ctx)模板templates/message.html
模板的使用大大的減少了數據量,而且更加靈活的實現了數據在展示層的分離,降低了模塊之間的耦合性。
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="." method="post"> {% for field in form %} {% csrf_token %} <div> {{ field.label_tag }}:{{ field }} {{ field.errors }} </div> {% endfor %}<div> <input type="submit" value="Remark"></div></form><hr>{% for tie in ties %} <div> <ul> <li>{{ tie.subject }}</li> <li>{{ tie.mail}}</li> <li>{{ tie.topic}}</li> <li>{{ tie.message }}</li> <li>{{ tie.cc_myself }}</li> </ul> <hr> </div>{% endfor%}</body></html>注意補辦標簽和模板變量都是我們在views.py的remark方法中聲明過的了,所以可以直接的使用。
初始化數據庫
這里使用的是sqlite數據庫,在settings.py文件中的配置如下;
# Database# https://docs.djangoproject.com/en/1.9/ref/settings/#databasesDATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }}然后在terminal 環境下,輸入下面的幾條命令:
// 創建數據庫表結構python manage.py makemigrationspython manage.py migrate// 按照提示進行操作即可,目的是為了創建一個超級管理員python createsuperuser//在自帶的開發服務器上運行我們的項目python manage.py runserver
調試驗證
這里我們在瀏覽器下輸入
127.0.0.1:8000/admin
就可以看到下面

然后輸入127.0.0.1:8000/remark

數據庫端:

這樣,除了沒有美化界面,其余的都完成了呢。
總結
這里雖然是個很簡單的小例子,但是我也從中發現了自己的一些概念上的問題,比如說對于模型設計的不合理,因為沒有評論時間,這就顯得很尷尬了。
然后是
if request.method =="POST": form = RemarkForm(request.POST) if form.is_valid(): myremark = Remark() myremark.subject=form.cleaned_data['subject'] myremark.mail = form.cleaned_data['mail'] myremark.topic = form.cleaned_data['topic'] myremark.message = form.cleaned_data['message'] myremark.cc_myself = form.cleaned_data['cc_myself'] myremark.save() # return HttpResponse("Publish Success!") else: form = RemarkForm() ctx = { 'form':form, 'ties':Remark.objects.all() } return render(request,'message.html',ctx)這段代碼,對應的表單中的action是.這就說明表單提交到了本頁面,也就實現了表單數據的評論,這一點很是巧妙。而且使用Django的這一個特點還有一個好處,那就是在不進行手動刷新頁面的情況下,仍然可以實現評論的異步加載。
最后,就是模型中Remark模型和RemarkForm表單屬性的一致性。這一點應該尤其的注意哦!
好了,今天就介紹到這里吧,由于本人能力一般,代碼或者邏輯有錯的地方,歡迎大家批評指正!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答
圖片精選