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\n") 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:\Python27\Lib\site-packages\Django-1.7.1-py2.7.egg\django\bin\mysite>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:\Python27\Lib\site-packages\Django-1.7.1-py2.7.egg\django\bin\mysite>python manage.py makemigrations
C:\Python27\Lib\site-packages\Django-1.7.1-py2.7.egg\django\bin\mysite>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文件夹
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步