目录:
1:收获
2:一些零碎的东西
3:吐槽
前言:
刚毕业,在上海担路网工作了一个多月,从7.12号到8.20号。
上海担路网主要产品是服务于中小企业,帮其定制发布PC网站,手机网站,微信公众号等等,算是一个互联网工具提供商。其主产品的主要技术构成是Django,Angular以及Tastypie。商家用户在其设置界面(非Django的admin)输入某项的对应数据(AngularJS)后(通过Angular的$Resource)接入到Tastypie的API从而操作Django的模型,通过Django的模板系统(用了不少Bootstrap的样式)将其展示在此商家的用户面前。还有个旁系产品是完全的前后端分离的项目。
一:收获
注:有些回顾可能由于时间原因会遗忘或者出现一些问题
- 第1,2周:
虽然写的是7.18的周任务,其实是7.12,7.18两周写的,第一周第一天布置环境,第二三天熟悉产品与代码的对应,后面几天写的就没有提交。
写的上面主要都是一些改动,Angular与Django方面的
其中记录两个解决费时多一点的:
1)其中的"与"&“或”查询的实现:
首先会想到使用Django的Q search
一般使用如下:
Poll.objects.get( Q(question__startswith=‘Who‘), Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)) ) 而我的需求是从一个Hbase形数据中提取,所以是动态的传入一个dict并且实现或查询。我很傻得半天不知道如何去拼接,哎,只知道string的+拼接,其实抽象出来都是一样的,这里换成Q object的|拼接就完了。 search_conditions = Q() for k,i in dict.items(): search_condition = search_condition | Q(k=i) 2) 查询改成POST提交 由于get提交的数据在url中会被服务器保存,所以在一些情况下改为post提交表单。 表单提交改为POST提交后的连带问题是分页,Django默认pagination是在url后通过/?page=n从而进入到get方法中,从而取出对应页的数据。这里的需求是将其改为post方法提交,但是依然是加入/?page=n到当前url,也就是所在request.method=“POST”中依然从request.GET中获取page参数。
默认的使用如下: {% if contacts.has_previous %} <a href="?page={{ contacts.previous_page_number }}">previous</a> {% endif %} 最后的解决办法是阻止翻页按钮的默认提交,将翻页按钮的href属性值加入到form的action中,然后点击提交form。这样的额外好处是还能够保持输入 大概代码如下 $("xxx").click(function(event){ event.prevendefault(); $("form").attr("action", $(this).attr("href")); $("form").submmit() } *要注意查询次数与翻页的关系,翻页不应该增加查询次数
- 第三周
这周测试那儿卡了整整一天半,各种排错没找出来,最后发现是基础数据其中的一个字段忘加了,而程序中此字段在用于查询时又是必须的(写在Tastypie部分的build_filter方法中的)。顺便记录下使用FIXTURE还是自己手动create的区别,对于与本次测试无关的辅助数据用FIXTURE,也就是几乎不会去修改他,否则用create,这样更explicit。
关于PEP8记录一点pycharm中的Code菜单栏的Inspect Code选项可以检测PEP8规范
git相关的有点多,就不总结到这儿了,待会儿专门写一个。
- 第四周
写自定义表单WIZARD部分整整用了一周,此功能是组里一个大神写的,Angular部分写的太猛,然后表单部分字段到前端的把模型类映射到表单类又弃用了Django自带的Widget,细节有些不太懂,所以改的很头疼,不会的时候有两天回家还看文档看到半夜,结果第二天直接昏昏沉沉。
后台Angular部分效果如下:
选择右边后添加到左边表单,点击表单后可以编辑此field的一些设置。最后在前台就能够直接出现此表单,填完后提交就多了条记录。
在此推荐一个找bootstrap样式片段的网站:http://bootsnipp.com/. 我的wizard样式就是在这里面输入form wizard找到的。
- 第五周
这里主要做的是将上面每个字段项可让用户分组,从而对应起每一步的wizard。
对了,这里有个注意点事外键约束的问题要考虑清楚,比如删除分组但并不能删除其里面的字段,因为可以选择不用wizard显示。但是默认的是要删除的,所以需要设置on_delete=models.SET_NULL
对了,还有个需要注意的是在数据库新加字段最好考虑下后倾向写成null=True,否则出问题后回滚比较麻烦
- 第六周
喏,待的最后一周的任务,其中dumpdata注意命令应该就是常使用下面的形式了:python manage.py dumpdata store.UserCategory --indent 4 --format json --pks 178,179,... > testdumpdata.json话说我当时看文档不知为何看漏了--pks参数,就发现没法取出某天特定数据,就用了在.py文件中查询->序列化->再写入文件的方法,其实这个方法挺好,可以写个脚步一次搞定完,但是问题在于可读性,没法达到--indent 4的那种效果。
一个卡的比较久的问题就是用例测试那儿了,由于刚写完单元测试,所以满脑子还在那儿的节奏,写了一大半才发现数据库使用了真实数据库而不是测试数据库,其实文档写的很清楚使用Django.test.LiveServerTestCase的话会在后端8081端口启动一个Django server,但是由于思维还在那儿这个一眼晃过没有在意。所以此时不应该再去访问8000端口,若有nginx的upstream server也应该对应改到8081端口(当然,可以自己指定端口号:https://docs.djangoproject.com/en/1.10/topics/testing/tools/)。这样的话才是使用的测试数据库的数据。
还有一个小问题是写server name时不要把前面的http://加入,我图方便,直接从浏览器中copy的,自然多了之,最后发现有之不行。联系下图顺便对应下window.location对象
二:一些零碎的东西
这里记录一些碰到过的很傻的一些问题(主要是我基础不好吧),还有些没记录的就遗忘了
- 关于Django模板变量与JS的联系问题
- 首先要明确的是模板变量在服务器端就会被赋值,而JS是在浏览器端执行的,所以常用的有
- 获取string形:var sth = "{{ sth }}";
- 获取其他对象:如在Djang视图中返回sth = json.dumps(dict(name="pd"))
- 首先要明确的是模板变量在服务器端就会被赋值,而JS是在浏览器端执行的,所以常用的有
则在JS中 var sth = {{ sth }};即可转化为JS的object
2. 若把js文件用引入的方式的话,在js文件中就无法获取模板变量了,解决方法是将其写成函数,参数为需要获得的模板变量,这样在template中调用即可。
2. 在Django 测试中post data,若使用json, 并不需要data=json.dumps(data), 写好对应的content_type即可。注意与JS中的微妙区别(js中如果是简单数据的话也不需要,否则最好序列化一下)
3. 修改/host/etcs可以将外部主机绑定到你希望的主机(一般是绑定到本地啦)
4. 用ajax提交表单时别忘记了加csrf_token,这里需要注意的是既可以将之加入到header中,也可以作为data的一部分进行发送,不过前一种更好。通过jquery的.ajax不同的options可以完成这两种不同的加入。(注,每个模板自带变量{{ csrf-token }})
5. 关于显示html, 注意开启{% autoescape on %},若是在js中想获取带html标签的可用safe过滤器。注意js插入时用.html(哈哈,没想到我习惯了写.text()。搞得废了半天劲)
未完待续,困===