代码还没读完就踏上了修改功能的深坑。还好思路清晰,通过修改模板和视图,实现了专题模块

原论坛的模式是用户点击节点发帖,然后就归到节点的分类里面了。我需要一个功能,就是右侧需要一个专题区,管理员发帖的话需要显示在那里。为了尽量小的修改实现功能,我决定设置一个管理员节点,然后在视图调用数据库过滤出节点,就可以了。

------

那么问题出现了,既然是节点,所有用户都可以点击节点发帖,这岂不乱了?

于是,我打起了发帖框的主意,如果能使用什么方法,使普通用户点击这个节点时不显示发帖框,管理员点击显示发帖框,从而就实现了对一般用户隐藏,达成目的。所以我翻看了模板。原模板如下:

{% if user.is_authenticated %}
<div class="box">
<form action="/node/{{node.slug}}/create" method="post" class="form-vertical" onSubmit="return beforeSubmit(this);"> {% csrf_token %}
{% for field in form %}
<div class="control-group">
<label class="control-label">{{ field.label_tag }}</label>
<div class="controls">
{{ field }}
</div>
<label>{{ field.errors }}</label>
</div>
{% endfor %}
</table>
<div class="control-group">
<div class="controls" style="margin-left: 0;float:right;">
<input type="submit" value="创建" class="btn btn-success">
</div>
</div>
</form>
</div>
{% else %}
<div class="required">您需要 <a style="height: 20px;line-height:20px;" href="/accounts/login">登录</a> 来发表新话题。没有账号,马上 <a style="height: 20px;line-height:20px;" href="/accounts/register">注册</a> 一个。</div>
{% endif %}

翻看用户的方法和模板的一些控制语句。找到了user.is_staffifnotequal两个很有用的东东。通过一些逻辑组合,就变成了如下的代码,实现了当用户未登录时显示请登录,登陆后如果是普通用户,在指定的父节点下,则不显示发帖框,如果是管理员则显示。

is_staff()可以判断用户是否可以登录后台

{% if user.is_authenticated %}
{% if user.is_staff %}
<div class="box">
<form action="/node/{{node.slug}}/create" method="post" class="form-vertical" onSubmit="return beforeSubmit(this);"> {% csrf_token %}
{% for field in form %}
<div class="control-group">
<label class="control-label">{{ field.label_tag }}</label>
<div class="controls">
{{ field }}
</div>
<label>{{ field.errors }}</label>
</div>
{% endfor %}
</table>
<div class="control-group">
<div class="controls" style="margin-left: 0;float:right;">
<input type="submit" value="创建" class="btn btn-success">
</div>
</div>
</form>
</div>
{% else %}
{% ifnotequal node.category.name '父节点名称' %}
<div class="box">
<form action="/node/{{node.slug}}/create" method="post" class="form-vertical" onSubmit="return beforeSubmit(this);"> {% csrf_token %}
{% for field in form %}
<div class="control-group">
<label class="control-label">{{ field.label_tag }}</label>
<div class="controls">
{{ field }}
</div>
<label>{{ field.errors }}</label>
</div>
{% endfor %}
</table>
<div class="control-group">
<div class="controls" style="margin-left: 0;float:right;">
<input type="submit" value="创建" class="btn btn-success">
</div>
</div>
</form>
</div>
{% endifnotequal %}
{% endif %}
{% else %}
<div class="required">您需要 <a style="height: 20px;line-height:20px;" href="/accounts/login">登录</a> 来发表新话题。没有账号,马上 <a style="height: 20px;line-height:20px;" href="/accounts/register">注册</a> 一个。</div>
{% endif %}

这样,templates部分的node.html模板功能就实现了。(这是点击节点后的显示模板)
还有一部分是首页index.html,主界面的部分也需要修改,因为原先有热门话题模块,所以可以很方便的拿来修改。

{% if special_topics %}
<div class="box">
<h4>专题</h4><hr class="line thin"/>
{% for item in special_topics %}
<div class="cell">
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tbody><tr>
<td width="24" valign="middle" align="center">
<a href="/people/{{item.author.get_profile.slug}}" title="{{ item.author.get_profile.name}}"><img src="/media/avatar/{{ item.author.get_profile.avatar }}" class="avatar" border="0" style="max-width: 24px; max-height: 24px;" alt="{{ item.author.get_profile.name}}"></a>
</td>
<td width="10"></td>
<td width="auto" valign="middle">
<span class="hot_topic_title">
<a href="/topic/{{item.id}}" title="{{item.title}}">{{item.title}}</a>
</span>
</td>
</tr>
</tbody></table>
</div>
{% endfor %}
<div class="clearfix"></div>
</div>
{% endif %}

上面原本的hot_topics已经被我替换成special_topics,至于这个special_topics,就需要使用views视图来定义了。
打开site目录的views模块。看见如下的一些代码:

hot_topics = Topic.objects.filter(created_on__range=[from_date, time_now]).order_by('-num_replies')[:10]
context['hot_topics'] = hot_topics
hot_nodes = Node.objects.filter(num_topics__gt=0,updated_on__gt=from_date).order_by('-updated_on')[:10]
context['hot_nodes'] = hot_nodes
return render(request,'index.html',context)

这样,通过定义context处理器实现了替换,只需要添加special_topics变量即可。获取指定的节点的数据。在模板中就可以显示了。
在Topic类下有node变量,外键是Node主题帖的节点,Node中有slug属性。这样就可以过滤出节点slug为“zt”的节点的所有主题帖。添加如下代码。

special_topics = Topic.objects.filter(node__slug__iexact="zt").order_by('-num_replies')[:10]
context['special_topics'] = special_topics

OK,使用管理员登陆,发帖,刷新,首页出现了“专题”模块。

————————-

吐槽:某度的搜索真心浪费时间,最开始使用node.slug出错,想找找使用外键的例子。就是出不来。

最后使用了基于Google的一个搜索,马上发现node.slug应该写成node__slug。纠结了好半天!

为Pythonic论坛添加一个“专题”功能的更多相关文章

  1. 为Pythonic论坛添加一个“专题”功能(续)

    上篇博文<为Pythonic论坛添加一个“专题”功能>,在模板的层次上对发帖进行了限制.也就是根据用户是否拥有权限来决定是否显示发帖框. 但是自从这么“投机取巧”的写完模板后,整夜辗转反侧 ...

  2. UITextView添加一个placeholder功能

    控件UITextField有个placeholder属性,UITextField和UITextView使用方法基本类似,有两个小区别:1.UITextField单行输入,而UITextView可以多行 ...

  3. 添加一个Android框架层的系统服务与实现服务的回调

    2017-10-09 概述 所谓Android系统服务其本质就是一个通过AIDL跨进程通信的小Demo的延伸而已.按照 AIDL 跨进程通信的标准创建一套程序,将服务端通过系统进程来运行实现永驻内存, ...

  4. 调用Android自带日历功能(日历列表单、添加一个日历事件)

    调用Android自带日历功能  觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...

  5. jQuery插件之路(一)——试着给jQuery的一个Carousel插件添加新的功能

    前几日在网上看到了一个关于Carousel插件的教学视频,于是也顺便跟着学习着做了一下.但是在做完之后发现,在别的网站上面看到类似的效果要比现在做的这个要多一个功能,也就是在底下会有一些按钮,当鼠标放 ...

  6. 为 JS 的字符串,添加一个 format 的功能。

    <script> String.prototype.format = function (kwargs) { var ret = this.replace(/\{(\w+)\}/g, fu ...

  7. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  8. 百度地图API 批量添加 带检索功能的信息窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. UEditor百度编辑器,工具栏上自定义添加一个普通按钮

    添加一个名叫“hougelou”的普通按钮在工具栏上: 第一步:找到ueditor.config.js文件中的toolbars数组,增加一个“hougelou”字符串,然后找到labelMap数组,对 ...

随机推荐

  1. 使用一个T-SQL语句批量查询数据表占用空间及其行数

    原文:使用一个T-SQL语句批量查询数据表占用空间及其行数 要找到数据库中数据表占用的空间和存在的行数.可以使用sp_spaceused搭配数据表的名称.就可以产生该表耗用的空间和现有行数. 如: U ...

  2. Codeforces 338D GCD Table 中国剩余定理

    主题链接:点击打开链接 特定n*m矩阵,[i,j]分值为gcd(i,j) 给定一个k长的序列,问能否匹配上 矩阵的某一行的连续k个元素 思路: 我们要求出一个解(i,j) 使得 i<=n &am ...

  3. codeforces Round #259(div2) E解决报告

    E. Little Pony and Summer Sun Celebration time limit per test 1 second memory limit per test 256 meg ...

  4. 朝花夕拾-4-shell

    引言 shell,我们常常会用到,以其强大的功能,会帮助我们解决非常多棘手的问题.近期遇到一个问题,要跑非常多case,假设串行的执行,须要非常久.能不能让他们并行起来,但又不能全部case都并行执行 ...

  5. emacs quick open and jump file (or buffer) which name is current word

    Sometime, we need to open a file or buffer which name begin with current word in emacs. Here I give ...

  6. crontab演出newLISP脚本设置环境变量

    今天遇到一个问题.执行在终端newLISP文字,一切正常,搬去crontab在将无法正常工作.即使crontab -e命令是在同一个用户执行.还是有问题. 因为newLISP脚本使用hive和hado ...

  7. 5、VS2010+ASP.NET MVC4+EF4+JqueryEasyUI+Oracle该项目的开发——使用datagrid做报表

    来点需要:我使用的数据库访问EF框架,但是,因为使用一个动态表来的统计报告中.单独是每天产生基于数据表,它是很难使用EF加盟前.所以我包装在两组数据库存取层的框内,一个是EF,一种是传统的ADO.NE ...

  8. 如何获得android手机通讯录的字母显示(两)

    随后的写如何使各第一字母显示相同的分类触点: 于adapter implement SectionIndexer 这项adapter必须在下面可以实现3接口: @Override public Obj ...

  9. Centos7系统配置上的变化(三)为网络接口添加多IP

    原文 Centos7系统配置上的变化(三)为网络接口添加多IP 实验的方法有 nmtui, 编辑ifcfg-*文件,ip addr 指令,子连接配置文件.一.nmtui手工添加IP 看一下当前网络设备 ...

  10. SqlServer发送邮件,定时作业

    今天偶然研究了一下sqlserver发送邮件的功能,之前听说过可以发,但是一直没尝试过,只是用C#写后台程序的方式来发邮件. 现在又多了一种发送邮件的途径. 大致的步骤如下: 1.配置sqlserve ...