搭建Django项目的操作步骤
这篇文章主要介绍搭建Django项目的操作步骤,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
一、创建一个Django项目
1、使用虚拟环境
#快速创建虚拟环境python-mvenvprjvenv#激活虚拟环境sourceprjvenv/bin/activate
2、创建项目
#安装djangopipinstalldjango#创建项目django-adminstartprojectmyblog
3、django设置
myblog/settings.py文件
TIME_ZONE='Asia/Shanghai'
4、数据库迁移
pythonmanage.pymigrate
5、启动
pythonmanage.pyrunserver
二、视图和URL配置
myblog/views.py文件
fromdjango.httpimportHttpResponse#最简单视图defhello(request):returnHttpResponse("Helloworld")#带参数的视图defhours_ahead(request,offset):try:offset=int(offset)exceptValueError:raiseHttp404()dt=datetime.datetime.now()+datetime.timedelta(hours=offset)html="In%shour(s),itwillbe%s."%(offset,dt)returnHttpResponse(html)
myblog/urls.py 文件
fromdjango.conf.urlsimporturlfromdjango.contribimportadminfrommyblog.viewsimporthellofrommysite.viewsimporthours_aheadurlpatterns=[url(r'^admin/',admin.site.urls),url(r'^hello/$',hello),url(r'^time/plus/(\d{1,2})/$',hours_ahead),]
三、使用Django模板
1、模板目录配置
myblog/settings.py文件
TEMPLATES=[{'BACKEND':'django.template.backends.django.DjangoTemplates','DIRS':['app1/templates','app2/templates'...],'APP_DIRS':True,'OPTIONS':{'context_processors':['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},]如果想在项目根目录中放一些主模板(例如在mysite/templates目录中),需要像这样设定DIRS:'DIRS':[os.path.join(BASE_DIR,'templates')],
2、视图函数
fromdjango.shortcutsimportrenderimportdatetimedefcurrent_datetime(request):now=datetime.datetime.now()returnrender(request,'current_datetime.html',{'current_date':now})
3、模板文件
myblog/templates/base.html文件
<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01//EN"><html><head><title>{%blocktitle%}{%endblock%}</title></head><body><h2>Myhelpfultimestampsite</h2>{%blockcontent%}{%endblock%}{%blockfooter%}<hr><p>Thanksforvisitingmysite.</p>{%endblock%}</body></html>
四、模型
1、配置数据库
myblog/setting.py
DATABASES={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':os.path.join(BASE_DIR,'db.sqlite3'),}}
2、创建应用
pythonmanage.pystartappbooks
3、激活应用
INSTALLED_APPS=(...'books',)
4、创建模型
myblogs/books/models.py
fromdjango.dbimportmodelsclassPublisher(models.Model):name=models.CharField(max_length=30)address=models.CharField(max_length=50)city=models.CharField(max_length=60)state_province=models.CharField(max_length=30)country=models.CharField(max_length=50)website=models.URLField()def__str__(self):returnself.nameclassAuthor(models.Model):first_name=models.CharField(max_length=30)last_name=models.CharField(max_length=40)email=models.EmailField()def__str__(self):returnself.last_nameclassBook(models.Model):title=models.CharField(max_length=100)authors=models.ManyToManyField(Author)publisher=models.ForeignKey(Publisher,on_delete=models.CASCADE)publication_date=models.DateField()def__str__(self):returnself.title
5、迁移数据库
#括号中的内容可以不需要pythonmanage.pymakemigrations(books)pythonmanage.pymigrate
6、操作数据
新增数据
方式一:p1=Publisher(...)p1.save()方式二:p1=Publisher.objects.create(...)
更新数据
方式一:p.name='ApressPublishing'p.save()方式二:Publisher.objects.filter(id=52).update(name='Apress')#推荐
查询数据
返回查询集合
Publisher.objects.all()Publisher.objects.filter(name='Apress')#WHEREname='Apress';Publisher.objects.filter(name__contains="press")#WHEREnameLIKE'%press%';
返回单个对象
Publisher.objects.get(name="Apress")#不是1个对象就会报异常try:p=Publisher.objects.get(name='Apress')#数据库中存在一个数据exceptPublisher.DoesNotExist:print("Apressisn'tinthedatabaseyet.")#数据库中没有数据else:print("Apressisinthedatabase.")#有多个数据
删除
方式一:单个删除p=Publisher.objects.get(name="O'Reilly")p.delete()方式二:批量删除Publisher.objects.filter(country='USA').delete()Publisher.objects.all().delete()
排序
方式一:使用order_by()Publisher.objects.order_by("name","age")#根据姓名和年龄排序,-name/-age实现反向排序方式二:在模型内定义classPublisher(models.Model):...classMeta:ordering=['name']
切片
Publisher.objects.order_by('name')[0:2]
五、后台管理
1、创建管理员用户
pythonmanage.pycreatesuperuser
2、将模型添加到后台管理
myblog/books/admin.py文件
fromdjango.contribimportadminfrom.modelsimportPublisher,Author,Bookadmin.site.register(Publisher)admin.site.register(Author)admin.site.register(Book)
3、修改模型,使字段在后台输入时变为可选项
myblog/books/models.py
classBook(models.Model):title=models.CharField(max_length=100)authors=models.ManyToManyField(Author)publisher=models.ForeignKey(Publisher,on_delete=models.CASCADE)publication_date=models.DateField(blank=True,null=True)
注意:如果想让日期字段(如 DateField、TimeField、DateTimeField)或数值字段(如 IntegerField、DecimalField、FloatField)接受空值,要同时添加 null=True 和 blank=True。
4、通过模型字段的verbose_name值指定后台显示的字段别名
myblog/books/models.py
classAuthor(models.Model):first_name=models.CharField(max_length=30)last_name=models.CharField(max_length=40)email=models.EmailField(blank=True,verbose_name='e-mail')
5、自定义修改后台管理列表
myblog/books/admin.py文件
fromdjango.contribimportadminfrom.modelsimportPublisher,Author,Book#自定义Author的后台管理列表classAuthorAdmin(admin.ModelAdmin):list_display=('first_name','last_name','email')#定义显示字段search_fields=('first_name','last_name')#添加字段搜索#自定义Book的后台管理列表classBookAdmin(admin.ModelAdmin):list_display=('title','publisher','publication_date')#定义显示字段list_filter=('publication_date',)#添加时间过滤器date_hierarchy='publication_date'#另一种日期过滤器ordering=('-publication_date',)#排序fields=('title','authors','publisher','publication_date')#自定义修改表单filter_horizontal=('authors',)#使用选项框(多对多关系时使用)raw_id_fields=('publisher',)#通过id选择对应选项admin.site.register(Publisher)admin.site.register(Author,AuthorAdmin)admin.site.register(Book,BookAdmin)
六、表单
(1)原生表单
1、获取request数据应该try或者设置默认值,防止报错
方式一:
defua_display_good1(request):try:ua=request.META['HTTP_USER_AGENT']exceptKeyError:ua='unknown'returnHttpResponse("Yourbrowseris%s"%ua)
方式二:
defua_display_good2(request):ua=request.META.get('HTTP_USER_AGENT','unknown')returnHttpResponse("Yourbrowseris%s"%ua)
2、简单的表单提交及表单实例
get和post指向相同的url,根据 if ‘q’ in request.GET:判断是GET还是POST
模板页面
#表单页面:myblog/templates/search_form.html<html><head><title>Search</title></head><body>{%iferrors%}#提示错误信息<ul>{%forerrorinerrors%}<li>{{error}}</li>{%endfor%}</ul>{%endif%}<formaction=""method="get">#action为空,表示提交到当前页面<inputtype="text"name="q"><inputtype="submit"value="Search"></form></body></html>
#结果展示页面:myblog/templates/search_results.html<html><head><title>BookSearch</title></head><body><p>Yousearchedfor:<strong>{{query}}</strong></p>{%ifbooks%}<p>Found{{books|length}}book{{books|pluralize}}.</p><ul>{%forbookinbooks%}<li>{{book.title}}</li>{%endfor%}</ul>{%else%}<p>Nobooksmatchedyoursearchcriteria.</p>{%endif%}</body></html>
视图函数:myblog/books/views.py文件
fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsedefsearch(request):errors=[]if'q'inrequest.GET:#如果是post,则存在GET['q']q=request.GET['q']ifnotq:errors.append('Enterasearchterm.')#提交了表单,但是内容为空eliflen(q)>20:#提交表单,长度超过限制errors.append('Pleaseenteratmost20characters.')else:#正常提交数据books=Book.objects.filter(title__icontains=q)returnrender(request,'search_results.html',{'books':books,'query':q})returnrender(request,'search_form.html',{'errors':errors})#不存在GET['q']说明是GET请求
路由:myblog/urls.py文件
urlpatterns=[...url(r'^search/$',views.search)]
(2)Django表单模型
1、定义表单类
myblog/books/forms.py
fromdjangoimportformsclassContactForm(forms.Form):subject=forms.CharField(max_length=100)#max_length指定最大长度email=forms.EmailField(required=False)message=forms.CharField(widget=forms.Textarea)#widget参数,指定表现逻辑,此次指定为文本框defclean_message(self):#自定义验表单证器message=self.cleaned_data['message']num_words=len(message.split())ifnum_words<4:raiseforms.ValidationError("Notenoughwords!")returnmessage
自定义表单验证器:Django 的表单系统会自动查找名称以 clean_ 开头、以字段名结尾的方法。如果存在这样的方法,在验证过 程中调用。这里,clean_message() 方法会在指定字段的默认验证逻辑(这个 CharField 是必填的)执行完毕后调用。
2、视图函数
myblog/books/views.py
frombooks.formsimportContactFormdefcontact(request):ifrequest.method=='POST':form=ContactForm(request.POST)ifform.is_valid():cd=form.cleaned_data#提示:如果没有配置邮件服务器,调用send_mail()时会抛出ConnectionRefusedError。send_mail(cd['subject'],cd['message'],cd.get('email','noreply@example.com'),['siteowner@example.com'],)returnHttpResponseRedirect('/contact/thanks/')else:form=ContactForm(initial={'subject':'Iloveyoursite!'}#可以初始值)returnrender(request,'contact_form.html',{'form':form})
3、表单页面
myblogs/templates/contact_form.html
方式一:使用系统默认表单
<html><head><title>Contactus</title></head><body><h2>Contactus</h2>{%ifform.errors%}<pstyle="color:red;">Pleasecorrecttheerror{{form.errors|pluralize}}below.</p>{%endif%}<formaction=""method="post">{%csrf_token%}<table>{{form.as_table}}</table>{%csrf_token%}<inputtype="submit"value="Submit"></form></body></html>
方式二:自定义表单外观样式
<html><head><title>Contactus</title></head><body><h2>Contactus</h2>{%ifform.errors%}<pstyle="color:red;">Pleasecorrecttheerror{{form.errors|pluralize}}below.</p>{%endif%}<formaction=""method="post"><div>{{form.subject.errors}}<labelfor="id_subject">Subject:</label>{{form.subject}}</div><div>{{form.email.errors}}<labelfor="id_email">e-mail:</label>{{form.email}}</div><div>{{form.message.errors}}<labelfor="id_message">Message:</label>{{form.message}}</div>{%csrf_token%}<inputtype="submit"value="Submit"></form></body></html>
4、路由设置
myblogs/myblogs/urls.py
urlpatterns=[...url(r'^contact/$',views.contact),]
以上是搭建Django项目的操作步骤的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。