• python3.4 + Django1.7.7 表单的一些问题


    上面是没有调用cleaned_data的提交结果,可见模版直接把form里面的整个标签都接收过来了




    下面是调用cleaned_data 的结果





    django 的表单,提交上来之后是这样的:

    #coding: gb2312
    from django import forms
    
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length=10,label='subject')#设置最大长度为10
        email = forms.EmailField(required=False,label='Email')#非必要字段
        message = forms.CharField(widget=forms.Textarea,label='message')#指定form中组件的类型
    
        #自定义校验规则,该方法在校验时被系统自动调用,次序在“字段约束”之后
        def clean_message(self):
            message = self.cleaned_data['message']#能到此处说明数据符合“字段约束”要求
            num_words = len(message.split())
            if num_words < 1:#单词个数
                raise forms.ValidationError("your word is too short!")
            return message


    比如下面这句:


    email = forms.EmailField(required=False,label='Email')#非必要字段

    其实可以作为非必要字段,required=False


    由于调用form.cleaned_data#只有各个字段都符合要求时才有对应的cleaned_data,之前好像必须得:

    if form.is_valid():#说明各个字段的输入值都符合要求

    所以上述字段required=False,在测试东西或者自己写东西,等安全性不高的场合就比较必要了


    #coding: gb2312
    from django.http import HttpResponse
    import datetime,calendar
    import time
    from django.http import HttpResponse
    from django.template import Context
    from django.template.loader import get_template
    from django.http import HttpResponse, Http404
    from django.contrib.auth.models import User
    from django.shortcuts import render_to_response
    from django.http import HttpResponseRedirect
    from django.contrib.auth import logout
    from django.template import RequestContext
    from django.core.urlresolvers import reverse
    from django.shortcuts import redirect
    
    #from django import form
    
    from django.shortcuts import render 
    from .forms import ContactForm 
    #from django.shortcuts import render_to_response
    #from django_manage_app.forms import ContactForm
    
    def current_datetime(request):
        now = time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))
        html = '<html><body>It is now %s.</body></html>' %now
        return HttpResponse(html)
        
    def show_readme(request):
        if request.method == 'POST':#提交请求时才会访问这一段,首次访问页面时不会执行
            form = ContactForm(request.POST)
        
           
        print (form['subject'])
        print (form['email'])
        print (form['message'])
        print ("show ----------------")
         
        
        #“首次访问”和“提交的信息不符合要求”时被调用
        return render_to_response('show.html', {'form': form})
        
        
    def contact_author(request):
        if request.method == 'POST':#提交请求时才会访问这一段,首次访问页面时不会执行
            form = ContactForm(request.POST)
            if form.is_valid():#说明各个字段的输入值都符合要求
                cd = form.cleaned_data#只有各个字段都符合要求时才有对应的cleaned_data
                #print (form.cleaned_data())
                
                print (cd['subject'])
                print (cd['email'])
                print (cd['message'])
                #return render_to_response('contact_author.html', {'form': form})
                #return redirect(reverse('','show_readme.html'))
                #return HttpResponseRedirect('/thanks/') 
                return render_to_response('show_readme.html', {'form': cd})
                #此处逻辑应该是先生成新的预览页面,再保存为txt
                
                #return response
                
            
        else:#首次访问该url时没有post任何表单
            form = ContactForm()#第一次生成的form里面内容的格式
            print (form)
            print (form.is_valid())
        
        #“首次访问”和“提交的信息不符合要求”时被调用
        return render_to_response('contact_author.html', {'form': form})
        #return render_to_response('show.html', {'form': form})
    
    
    
    def thanks(request):
    
        return render_to_response('thanks.html')
        
        
    def download_file(request):   
        #from django.http import HttpResponse          
        ## CSV  
        #import csv      
        #response = HttpResponse(mimetype='text/csv')  
        #response['Content-Disposition'] = 'attachment; filename=my.csv'  
        #writer = csv.writer(response)  
        #writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])  
        #writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])  
     
        # Text file  
        response = HttpResponse(content_type='text/plain')                                
        response['Content-Disposition'] = 'attachment; filename=my.txt'                
        response.write("aa
    ")  
        response.write("bb")   
         
        # PDF file   
        #http://code.djangoproject.com/svn/django/branches/0.95-bugfixes/docs/outputting_pdf.txt  
        #from reportlab.pdfgen import canvas  #need pip ind
        #response = HttpResponse()#)mimetype='application/pdf')  
        #response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'  
        #p = canvas.Canvas(response)  
        #p.drawString(100, 100, "Hello world.")  
        #p.showPage()  
        #p.save()  
        
        
        #response = HttpResponse()
        fout=open("mysite//test.txt","wt") 
        str = "hello world"
        fout.write(str)
        fout.close()     
        #response['Content-Disposition'] = 'attachment; filename=test.txt' 
        data = open("mysite//test.txt", "rb").read()
    
        html = '<html><body>%s</body></html>' %str
        return response#HttpResponse(data, content_type="text/plain")
        
    



    提交给模版的html:


    <html>
    <style type="text/css">
        
        .field{
            background-color:#BCD8F5;
        }
    </style>
    <head>
        <title>show readme</title>
    </head>
    <body>
    
        
        
            <!<div class="field">
    	
                 {{ form.subject }}
                 {{ form.email }}
                 {{ form.message }}
                
            <!</div>
            
       
    </body>
    </html>



    Django本身内建有一些app,例如注释系统和自动管理界面。
    app的一个关键点是它们是很容易移植到其他project和被多个project复用。

    对于如何架构Django代码并没有快速成套的规则。
    如果你只是建造一个简单的Web站点,那么可能你只需要一个app就可以了;
    但如果是一个包含许多不相关的模块的复杂的网站,
    例如电子商务和社区之类的站点,那么你可能需要把这些模块划分成不同的app,以便以后复用。

     
     数据库模型有有效性验证

    C:Python27Libsite-packagesDjango-1.7.1-py2.7.eggdjangoinmysite>python manage.py sqlall books

    CommandError: App 'books' has migrations. Only the sqlmigrate and sqlflush commands can be used when an app has migrations.

    此时需要输入如下部分即可

    C:Python27Libsite-packagesDjango-1.7.1-py2.7.eggdjangoinmysite>python manage.py makemigrations

    C:Python27Libsite-packagesDjango-1.7.1-py2.7.eggdjangoinmysite>python manage.py migrate


    若上述问题依旧:
    Since there is still a bit of backwards compatibility with django 1.6 and below you can still use the sql commands from django-admin. However, you have to delete the migrations folder first.

    To get the create statements you need to remove the migrations folder
    直接删除books app下面的migrations文件夹


    
    
  • 相关阅读:
    WPS 模拟手写签名
    Flask 正则匹配路由、异常
    FLASK 加载配置、简单传参调用、指定请求方式、返回json、网页跳转(也可以自己的视图函数)、自定义状态码
    python IDLE 自动提示功能
    PYQT设计无边框窗体
    PYQT窗口居中
    PYQT窗口托盘目录
    PYQT窗口风格
    PYQT窗口可视化编程
    PYQT控件使用
  • 原文地址:https://www.cnblogs.com/wangyaning/p/7854007.html
Copyright © 2020-2023  润新知