Home  >  Article  >  Backend Development  >  Python Django uses forms to implement comment functionality

Python Django uses forms to implement comment functionality

高洛峰
高洛峰Original
2017-01-21 14:10:362096browse

It seems that Django has given up the use of its own comments since version 1.6. The specific reason has not been investigated, but now the comment function can also be implemented using Django’s internal module, that is, with the help of the forms module. Here is mine A small example.

Environment preparation
•Operating system: windows 7 64-bit ultimate version
•IDE: PyCharm 2016.1
•Python:2.7.11
•Django:1.9.6

Design

The so-called design refers to the underlying model that will be involved in the comment function we are going to implement. My simple design here is as follows. You can set it as you like according to your own ideas. My settings here can be found in the models.py file:

from __future__ import unicode_literals
from django.contrib import admin
from django.db import models
from 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,])

Everyone has seen it, models.py file There is an additional subclass of forms, this time because our operation involves web forms. In this case, it is best to create a Form form class for each model class to facilitate obtaining cleaned_data from the form.

url mapping file urls.py

This file is relatively simple, as follows:

"""FormRelative URL Configuration
 
The `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 url
from django.contrib import admin
from app.views import *
urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^remark/$',reamark),
]
   
 视图层views.py

This file determines the display view corresponding to the mapping file, so compare importance.

from django.shortcuts import render
from 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 templates/message.html

The use of templates greatly reduces the amount of data and enables more flexible data display The separation of layers reduces the coupling between modules.

<!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>

Note that the reissue tags and template variables have been declared in the remark method of views.py, so they can be used directly.

Initialize the database

The sqlite database is used here. The configuration in the settings.py file is as follows;

# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
 
DATABASES = {
  &#39;default&#39;: {
    &#39;ENGINE&#39;: &#39;django.db.backends.sqlite3&#39;,
    &#39;NAME&#39;: os.path.join(BASE_DIR, &#39;db.sqlite3&#39;),
  }
}

Then in the terminal Environment, enter the following commands:

// 创建数据库表结构
python manage.py makemigrations
 
python manage.py migrate
 
// 按照提示进行操作即可,目的是为了创建一个超级管理员
python createsuperuser
 
//在自带的开发服务器上运行我们的项目
python manage.py runserver

Debug Verification

Here we enter in the browser
127.0.0.1:8000/admin
You can see the following

Python Django使用forms来实现评论功能

Then enter 127.0.0.1:8000/remark

Python Django使用forms来实现评论功能

Database side:

Python Django使用forms来实现评论功能

In this way, except for the beautification of the interface, the rest is completed.

Summary

Although this is a very simple example, I also discovered some conceptual problems of my own, such as the unreasonable model design because there is no comment time. This seems very embarrassing.

Then

if request.method =="POST":
    form = RemarkForm(request.POST)
    if form.is_valid():
      myremark = Remark()
      myremark.subject=form.cleaned_data[&#39;subject&#39;]
      myremark.mail = form.cleaned_data[&#39;mail&#39;]
      myremark.topic = form.cleaned_data[&#39;topic&#39;]
      myremark.message = form.cleaned_data[&#39;message&#39;]
      myremark.cc_myself = form.cleaned_data[&#39;cc_myself&#39;]
      myremark.save()
      # return HttpResponse("Publish Success!")
  else:
    form = RemarkForm()
 
  ctx = {
    &#39;form&#39;:form,
    &#39;ties&#39;:Remark.objects.all()
  }
  return render(request,&#39;message.html&#39;,ctx)

This code, the action in the corresponding form is. This means that the form is submitted to this page, and the comment on the form data is realized. , this is very clever. And there is another advantage of using this feature of Django, that is, asynchronous loading of comments can still be achieved without manually refreshing the page.

Finally, it is the consistency of the Remark model and the RemarkForm form attributes in the model. You should pay special attention to this!

Okay, that’s it for today. Due to my average ability, if there are any mistakes in the code or logic, everyone is welcome to criticize and correct me!

The above is the entire content of this article. I hope it will be helpful to everyone's learning. I also hope that everyone will support the PHP Chinese website.

For more Python Django uses forms to implement the comment function, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn