Django--16 form表单
一、Django Form的作用
二、django Form的使用
三、基本思路
1.将登陆页面单独出来。可以做成页面,或小窗口。创建login.html。
2.在公共mysite中建立新的文件forms.py。创建新的模型loginform。
数据验证
设置输入框属性使其在页面美化。
3.登录页面处理
页面优化,应用bootcss框架。
登录页面自定义
4.后台验证处理 def lpogin
代码优化:
继续优化,将用户名和密码验证移到 form中。之后传入user就行。
四、注册
1.在form模型中增加
数据验证:
2.views中增加注册方法
第二种写入user注册信息的方法 等同于 User.objects.create_user(username,email,password)
3. 注册url
4.模板页面register
5.在文章页面添加进入方法
五、django--ckeditor富文本表单 每个字段类型都有一个适当的默认Widget类。
1.在comment中创建form.py表单。
1 from django import forms 2 3 class CommentForm(forms.Form): 4 content_type = forms.CharField() 5 object_id = forms.IntegerField() 6 text = forms.CharField()
增加数据验证:
class CommentForm(forms.Form):
content_type = forms.CharField(widget=forms.HiddenInput)
object_id = forms.IntegerField(widget=forms.HiddenInput)
text = forms.CharField(widget=forms.Textarea)
def clean(self):
#评论对象验证
content_type = self.cleaned_data('content_type')
object_id = self.cleaned_data('object_id')
try:
model_class = ContentType.objects.get(models=content_type).model_class()
model_obj = model_class.objects.get(pk=object_id)
self.cleaned_data['content_object'] = model_obj
except ObjectDoesNotExist:
raise forms.ValidationError('评论对象不存在')
return self.cleaned_data
传入user继续:
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.db.models import ObjectDoesNotExist
class CommentForm(forms.Form):
content_type = forms.CharField(widget=forms.HiddenInput)
object_id = forms.IntegerField(widget=forms.HiddenInput)
text = forms.CharField(widget=forms.Textarea)
def __init__(self,*args,**kwargs): # 处理传过来的参数,*args任意类型参数,**kwargs任意关键字参数
if 'user' in kwargs:
self.user = kwargs.pop('user') # pop从kwargs中剪出user给selfuser.
super(CommentForm,self).__init__(*args,**kwargs)
def clean(self):
# 根据上面传入的user进行验证
if self.user.is_authenticated:
self.cleaned_data['user'] = self.user
else:
raise forms.ValidationError('用户尚未登录')
#评论对象验证
content_type = self.cleaned_data('content_type')
object_id = self.cleaned_data('object_id')
try:
model_class = ContentType.objects.get(model=content_type).model_class()
model_obj = model_class.objects.get(pk=object_id)
self.cleaned_data['content_object'] = model_obj
except ObjectDoesNotExist:
raise forms.ValidationError('评论对象不存在')
return self.cleaned_data
from django import forms from django.contrib.contenttypes.models import ContentType from django.db.models import ObjectDoesNotExist from ckeditor.widgets import CKEditorWidget class CommentForm(forms.Form): content_type = forms.CharField(widget=forms.HiddenInput) object_id = forms.IntegerField(widget=forms.HiddenInput) text = forms.CharField(widget=CKEditorWidget(config_name='comment_ckeditor'), error_messages={'required':'评论内容不能为空'}) def __init__(self,*args,**kwargs): # 处理传过来的参数,*args任意类型参数,**kwargs任意关键字参数 if 'user' in kwargs: self.user = kwargs.pop('user') # pop从kwargs中剪出user给selfuser. super(CommentForm,self).__init__(*args,**kwargs) def clean(self): # 根据上面传入的user进行验证 if self.user.is_authenticated: self.cleaned_data['user'] = self.user else: raise forms.ValidationError('用户尚未登录') #评论对象验证 content_type = self.cleaned_data['content_type'] object_id = self.cleaned_data['object_id'] try: model_class = ContentType.objects.get(model=content_type).model_class() model_obj = model_class.objects.get(pk=object_id) self.cleaned_data['content_object'] = model_obj except ObjectDoesNotExist: raise forms.ValidationError('评论对象不存在') return self.cleaned_data
修改comment/views方法
def update_comment(request):
referer = request.META.get('HTTP_REFERER', reverse('home'))
comment_form = CommentForm(request.POST,user=request.user) # 实例化并传参数
if comment_form.is_valid():
#检查通过,保存数据
comment = Comment()
comment.user = comment_form.cleaned_data['user']
comment.text = comment_form.cleaned_data['text']
comment.content_object = comment_form.cleaned_data['content_object']
comment.save()
return redirect(referer)
else:
return render(request,'error.html',{'message':comment_form.errors,'redirect_to':referer})
# referer = request.META.get('HTTP_REFERER', reverse('home')) # #数据检查 # if not request.user.is_authenticated: # return render(request,'error.html',{'message':'用户未登录!','redirect_to':referer}) # # text = request.POST.get('text','').strip() # if text == '': # return render(request,'error.html',{'message':'评论为空!','redirect_to':referer}) # # try: # content_type = request.POST.get('content_type','') # object_id = int(request.POST.get('object_id','')) # # model_class = ContentType.objects.get(model=content_type).model_class() # model_obj = model_class.objects.get(pk=object_id) # # except Exception as e: # return render(request,'error.html',{'message':'评论对象不存在!','redirect_to':referer }) # # #检查通过,保存数据 # comment = Comment() # comment.text = text # comment.user = request.user # comment.content_object = model_obj # comment.save() # # return redirect(referer)
from django.shortcuts import render,redirect from django.contrib.contenttypes.models import ContentType from django.urls import reverse from django.http import JsonResponse from comment.models import Comment from comment.forms import CommentForm def update_comment(request): referer = request.META.get('HTTP_REFERER', reverse('home')) comment_form = CommentForm(request.POST,user=request.user) # 实例化并传参数 data = {} if comment_form.is_valid(): #检查通过,保存数据 comment = Comment() comment.user = comment_form.cleaned_data['user'] comment.text = comment_form.cleaned_data['text'] comment.content_object = comment_form.cleaned_data['content_object'] comment.save() # 返回数据 data['status'] = 'SUCCESS' data['username'] = comment.user.username data['comment_time'] = comment.comment_time.strftime('%Y-%m-%d %H:%M:%S') data['text'] = comment.text else: #return render(request,'error.html',{'message':comment_form.errors,'redirect_to':referer}) data['status'] = 'ERROR' data['message'] = list(comment_form.errors.values())[0][0] return JsonResponse(data)
2.要在blog_detail页面渲染,先修改处理方法views.
context['comment_form'] = CommentForm()
实例化时传入参数
data = {}
data['content_type'] = blog_content_type.model #model 使字符串化
data['object_id'] = blog_pk
context['comment_form'] = CommentForm(initial=data)
页面渲染
{{ comment_form }}
页面代码简化:
{% if user.is_authenticated %}
<form action="{% url 'update_comment' %}" method="POST" style="overflow:hidden">
{% csrf_token %}
<label >{{ user.username }},欢迎评论!</label>
{{ comment_form }}
<input type="submit" value="评论" class="btn btn-primary" style="float:right">
</form>
{% else %}
你尚未登录,登录之后方可评论!
<a class="btn btn-primary" href="{% url 'login' %}?from={{ request.get_full_path }}">登录</a> {# ?from=通过get方式吧网址参数传出#}
<span>or</span>
<a class="btn btn-primary" href="{% url 'register' %}?from={{ request.get_full_path }}">注册</a>
{% endif %}