您的位置:首页 > 编程语言 > Go语言

django搭建个人博客11,项目发布展示

2017-06-20 02:28 591 查看

编写项目展示页

1.这是项目的数据模型

class tb_projs(models.Model):
projID=models.AutoField(primary_key=True,verbose_name="作品ID")
title=models.CharField(max_length=24,db_index=True,verbose_name="作品名")
abstract=models.CharField(max_length=140,verbose_name="作品简介")
uploaded=models.DateTimeField(verbose_name="作品发布时间")
imgsURL=models.URLField(verbose_name="作品图集")
gitURL=models.URLField(verbose_name="作品GitHubURL")


2.功能需求

  1.imgsURL是作品图集static/www/projImgs

  2.该页面提供一个相册效果,相片是各个项目的照片之一,下面是名字。

  3.相片的URL根据imgsURL和img的Id及照片编号来构造,例如…/projImgs/Id_1.jpg。

  4.每个项目提供5张照片,首页编号为1。

  5.项目名字的URL跳转到项目的github地址上去。项目图片跳转到图册,里面有项目的5张照片图册和简介及名字。

  6.上传的照片会被按顺序重新命名,eg:1_1.jpg,1_5.jpg,2_1.jpg…然后传入指定文件夹。

3.大致思路

 1.项目发布页

  1.共4项要填写,项目名称,项目简介,上传图片,gitURL。上传图片我打算用django的ImageField,并且不打算使用批量上传插件,所以得在表单里创建5个图片上传项。

class ProjForm(forms.Form):
title=forms.CharField()
abstract=forms.CharField(max_length=140)
gitURL=forms.URLField()
img1=forms.ImageField()
img2=forms.ImageField()
img3=forms.ImageField()
img4=forms.ImageField()
img5=forms.ImageField()


  2.在表单页填好信息,传递给View层,View里调用form_valid,函数里实现里构造好tb_projs对象,保存对象,保存图片。在官方手册查阅了File类实现文件保存后,写出如下代码

class ProjPublishView(FormView):
template_name="www/proj_publish_base.html"
form_class=ProjForm
absolute_path='/virEnv/mysite/www/static/'
def form_valid(self,form):
if form.is_valid():
data=form.cleaned_data
title=data['title']
abstract=data['abstract']
uploaded=datetime.datetime.now()
gitURL=data['gitURL']
imgsURL=www/projImgs'
proj=tb_projs(title=title,abstract=abstract,uploaded=uploaded,imgsURL=imgsURL,gitURL=gitURL)
proj.save()
img1_path=self.absolute_path+imgsURL+'/'+str(proj.projID)+'_1.jpg'
self.handle_uploaded_img(self.request.FILES['img1'],img1_path)
img2_path=self.absolute_path+imgsURL+'/'+str(proj.111
111projID)+'_2.jpg'
self.handle_uploaded_img(self.request.FILES['img2'],img2_path)
img3_path=self.absolute_path+imgsURL+'/'+str(proj.projID)+'_3.jpg'
self.handle_uploaded_img(self.request.FILES['img3'],img3_path)
img4_path=self.absolute_path+imgsURL+'/'+str(proj.projID)+'_4.jpg'
self.handle_uploaded_img(self.request.FILES['img4'],img4_path)
img5_path=self.absolute_path+imgsURL+'/'+str(proj.projID)+'_5.jpg'
self.handle_uploaded_img(self.request.FILES['img5'],img5_path)
return super(ProjPublishView,self).form_valid(form)

def handle_uploaded_img(self,f,path):
with open(path,'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)

def get_success_url(self):
#success_url=reverse('www:projList',kwargs={'page':1})
success_url=reverse('www:indexView')
return success_url


 2.验证结果

  1.上传页面



  2.数据库查看



  3.文件夹下查看文件



 3.项目展示页

  1.项目展示页使用的是ListView,绑定的model是tb_projs.默认返回context就是全部的tb_projs.objects

  2.效果如下



  3.编写html模板时使用了get_static_prefix以及divisibleby

<img src="{% get_static_prefix %}{{o.imgsURL}}/{{o.projID}}_1.jpg"
alt="{{p.title}}" class="img-responsive">


{% if forloop.counter|divisibleby:'4' == False and forloop.counter|divisibleby:'2' %}
<div class="clearfix visible-xs-block"></div>
{% endif %}
{% if forloop.counter|divisibleby:'4' %}
<div class="clearfix visible-xs-block"></div>
{% endif %}


 4.项目详细页

  1.项目详细页使用DetailView,绑定的model是tb_projs。get_object()里使用objects.get()来根据id过滤。get_context_data()直接返回context

  2.效果如下

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  django 博客