模型窗体类ModelForm的应用
urls.py
from django.conf.urls import url
from django.contrib import admin
from testdb import views
urlpatterns = [
url(r'^$',views.index),
url(r'^alert/$',views.alert),
url(r'^admin/', admin.site.urls),
url(r'^(\d+)/(\w+)/$',views.index),
url(r'^list/$',views.listing),
url(r'^post/$',views.posting),
url(r'^contact/$',views.contact),
url(r'^post2db/$',views.post2db),
forms.py
# -*- coding: utf-8 -*-
from django import forms
from testdb import models
class ContactForm(forms.Form):
CITY = [['TP','TaiPei'],['TY','TaoYuang'],['TC','TaiChuang'],['TN','TaiNan'],['KS','Kaohsiung'],['NA','Others'],]
user_name = forms.CharField(label="您的姓名",max_length=50,initial='无名')
user_city = forms.ChoiceField(label='居住城市',choices=CITY)
user_school = forms.BooleanField(label='是否在学',required=False)
user_email = forms.EmailField(label='电子邮件')
user_message = forms.CharField(label='你的意见',widget=forms.Textarea)
class PostForm(forms.ModelForm):
class Meta:
model = models.Post
fields = ['mood','nickname','message','del_pass']
def __init__(self,*args,**kwargs):
super(PostForm,self).__init__(*args,**kwargs)
self.fields['mood'].label = '现在的心情'
self.fields['nickname'].label = '您的昵称'
self.fields['message'].label = '心情留言'
self.fields['del_pass'].label = '设置密码'
views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.shortcuts import render
from django.template.loader import get_template
from django.http import HttpResponse,HttpResponseRedirect
from testdb import models,forms
from django.template import RequestContext,Context,Template
from django.core.mail import send_mail,send_mass_mail,EmailMultiAlternatives
from django.conf import settings
# Create your views here.
def posting(request):
template = get_template('posting.html')
moods = models.Mood.objects.all()
message = '如果要发布信息,那么每个字段都要填写...'
# request_context = RequestContext(request)
# request_context.push(locals())
# #html = template.render(request_context)
html = template.render(context=locals(),request=request)
# html = template.render(locals())
return HttpResponse(html)
def index(request,pid=None,del_pass=None):
template = get_template('index.html')
posts = models.Post.objects.filter(enabled=True).order_by('-pub_time')[0:30]
moods = models.Mood.objects.all()
try:
user_id=request.GET['user_id']
user_pass=request.GET['user_pass']
user_post=request.GET['user_post']
user_mood=request.GET['mood']
except:
user_id=None
message='如果要发布信息,那么每个字段都要填写...'
if del_pass and pid:
try:
post = models.Post.objects.get(id=pid)
except:
post = None
if post:
if post.del_pass == del_pass:
post.delete()
message = '数据删除成功'
else:
message = '密码错误'
elif user_id != None and user_id != '':
mood=models.Mood.objects.get(status=user_mood)
post = models.Post.objects.create(mood=mood,nickname=user_id,del_pass=user_pass,message=user_post)
post.save()
message='成功存储!请记得你的编辑密码[{}]!,信息须经审核后才会显示。'.format(user_pass)
else:
message='如果要发布信息,那么每个字段都要填写...'
html = template.render(locals())
return HttpResponse(html)
def alert(request):
template = get_template('alert.html')
html = template.render()
return HttpResponse(html)
def listing(request):
template = get_template('listing.html')
posts = models.Post.objects.filter(enabled=True).order_by('-pub_time')[0:50]
moods = models.Mood.objects.all()
html = template.render(locals())
return HttpResponse(html)
def contact(request):
if request.method =='POST':
form = forms.ContactForm(request.POST)
if form.is_valid():
message = '感谢您的来信,我们会尽快处理您的宝贵意见。'
user_name = form.cleaned_data['user_name']
user_city = form.cleaned_data['user_city']
user_school = form.cleaned_data['user_school']
user_email = form.cleaned_data['user_email']
user_message = form.cleaned_data['user_message']
email_subject = u'来自【不吐不快】网站的网友意见'
email_body = u'''
网友姓名:{}
居住城市:{}
是否在学:{}
反映意见:如下
{}'''.format(user_name,user_city,user_school,user_message)
#email_from = 'xxxx@163.com'
email_from = settings.EMAIL_HOST_USER
email_to = ['xxxxx@qq.com',]
res = send_mail(email_subject,email_body,email_from,email_to,fail_silently=False)
if res == 1:
message = '邮件发送成功!'
else:
message = '邮件发送失败'
else:
message = '请检查您输入的信息是否正确!'
else:
form = forms.ContactForm()
template = get_template('contact.html')
request_context = RequestContext(request)
request_context.push(locals())
#html = template.render(request_context)
html = template.render(context=locals(),request=request)
return HttpResponse(html)
def post2db(request):
message_flag = False
if request.method == 'POST':
post_form = forms.PostForm(request.POST)
if post_form.is_valid():
message = '您的信息已存储,要等管理员启用后才能看到。'
message_flag =True
post_form.save()
return HttpResponseRedirect('/list/')
else:
message = '如果要发布信息,那么每个字段都要填写...'
else:
post_form = forms.PostForm()
message = '如果要发布信息,那么每个字段都要填写...'
template = get_template('post2db.html')
request_context = RequestContext(request)
request_context.push(locals())
html = template.render(context=locals(),request=request)
return HttpResponse(html)
post2db.html
<!-- post2db.html(ch08www project) -->
{% extends 'base.html' %}
{% block title %}我有话要说{% endblock %}
{% block content %}
{% if message %}
{% if message_flag %}
<div class='alert alert-success'>
{% else %}
<div class='alert alert-warning'>
{% endif %}
{{message}}</div>
{% endif %}
<div class='container'>
<form name='my form' action='.' method='POST'>
{% csrf_token %}
<table>
{{post_form.as_table}}
</table>
<br/>
<input type='submit' value='发布'>
<input type='reset' value='清除重填'>
</form>
</div>
{% endblock %}
header.html
<!-- header.html(ch08www project) -->
<nav class='navbar navbar-default'>
<div class='container-fluid'>
<div class='navbar-header'>
<div class='navbar-brand' align=center>
不吐不快
</div>
</div>
<ul class='nav navbar-nav'>
<li class='active'><a href='/'>Home</a></li>
<li><a href='/list'>浏览信息</a></li>
<li><a href = '/post'>发布信息</a></li>
<li><a href = '/post2db'>发布信息(ModelForm)</a></li>
<li><a href='/contact'>联系管理员</a></li>
<li><a href='/admin'>后台管理</a></li>
</ul>
</div>
</nav>
实测效果: