这篇文章主要介绍搭建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项目的操作步骤的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!