一、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 %}

posted on 2019-01-16 18:32  南飞雁ht  阅读(244)  评论(0编辑  收藏  举报