django的最简论坛模型

这个讨论如何用django做出一个最简单的论坛框架,老实说,目前为止,基本是玩具,并且由于最近这样那样的原因,大概半年左右,这个东西基本会坑着。不过本着简单研究django的目的,基本上也能看出点眉目,举一反三应该会更容易吧?下一版我应该会放弃django而改用flask重构一遍,原因是django虽然使用起来很方便,但是个人一直不喜欢太重的玩意。而且老实说,django资源太多了,完成之后没有什么成就感……虽然估计你们没什么兴趣,但是我还是给出项目地址,方便对照程序。kutoto

先明确一下这个所谓的最简模型做的东西:

  • Topic的增加和删除

  • posts的增删改查

ok……如您所见,没有登陆,没有权限,没有后台—-几乎不算是一个论坛了?

总之,先就这么着吧,写起来越容易越好不是么。

一个典型的django程序的惯用做法是,总之先新建一个app。于是我在这个项目里面建了一个新的app叫做formu,我们的主要代码都会写在里面。

首先说说setting,我使用数据库是mysql,或许使用postgreSQL更符合您的习惯,当然我也是这么认为的,但是并不总是所有的vps都有postgreSQL。新建一个数据库然后在setting中指定应该是常识来着是吧?

然后是url.py。话说我也不太确定这玩意应该是在写view里面的函数之前还之后定义……take it easy,怎么都好吧。

然后是formu中的定义。

一般而言,最开始是model的定义。当然,我们需要定义的是Topic和Post。如果愿意的话,你也可以把Account加进去。当然,我还顺便定义了一个Tag什么的,都无所谓的。

model的定义,不累述,都差不多。

接下来是views,由于需求的限制,很容易看出需要六个处理函数。不过需要注意的是,事实上,新建一个Topic和新建一个Post是一样的,所以,这两个可以通过是否指定了tid来进行识别,从而压缩成一个函数。

index函数是最容易实现的,只需要直接提取topics就好。当然值得注意的只有排序的问题。由于论坛的主题有一个被顶上去的操作,这直接说明了,我们应该根据最后回复时间正序排序。其他没什么好说的。

比较困难的是新建post的操作。

这里先说明,无论是新建post或者是编辑post,都是要考虑get和post行为的。get操作的时候,下载表单。post提交数据。更复杂的是django表单处理本身就不太容易。

先实现forms.py这个文件吧。

新表单和编辑表单事实上不太一样。很容易想象,只是编辑的话,topic一栏是不需要填写任何东西的,而新表单不然。而实质上,新表单会新生成一个post,可能的话,还会有一个topic生成,而编辑表单只是修改旧的post而已。

但是它们是有很多相似之处的。比如,都需要生成一个供人填写的表单,以及,都需要记录输入的内容。

这提示我们,需要给定一个父类完成相同的那部分操作,而不同的操作,留到子类实现。

父类很简单,似乎给定两个输入框就好。但是实际上更复杂一些。

请注意,我们事实上希望同时能支持新建主题和新建post两种不同的操作。而所谓的新建主题,可以简单的理解为新建一个topic和一个post。

理解了上面的,实现起来并不麻烦。我们只需要多传入一个标志符,通过这个标志符识别是要新建post还是新建主题。如果不喜欢多一个难看的标志符,你也可以直接传入topic实例以示区别。

对于新建post来说,当然仅仅一个content是不够的,所以还需要我们传入更多的参数,当然这部分直接耦合进代码也不是什么大问题。

所以现在看forms,很简单了,对吧?

解决了forms的问题,再回过头看看views。

由于new_post同时兼顾主题和post的新建,所以,必有一个参数是tid—-我们通过这个参数来识别是否是新主题。

当处于get状态的时候,只需要简单地渲染一下form的界面就好。而post的时候,我们传入构建一个post需要的其他的ip啊,用户啊之类的值,然后如果这个form是有效的(没错误),我们调用form中的save函数,去生成对应的数据库表项。最后,为了友好,并且能给用户一个操作成功的信息,我们重定向到首页去就好。当然您或许认为直接定到首页并不友好,也请随意。

编辑的操作和这个差不多,唯一的区别是,我们不需要subject这一项了。

删除操作相对而言很简单,只需要得到需要删除的post或者topic,然后调用delete()方法就好。但是需要一说的是,删除之后,您或许需要处理一些其他相关的信息。比如,您的topic中有一项是对应posts的数目,那么,请谨慎地重新统计一遍吧。

其他的貌似就没什么特别值得一说的,本来挺想写点深入研究的内容的,但是最近各种笔试面试弄得心浮气躁,压根没什么心情,于是就这样吧。

以上。