自定义Django.contrib.comments honeypot

时间:2013-01-06 22:00:26

标签: django django-comments honeypot

我正在使用Django的标准评论系统,我想扩展其反垃圾邮件蜜罐功能。

我想把字段的默认“名称”和“id”更改为垃圾邮件机器人(如“网站”)更具吸引力。我检查了html,看起来像这样:

 <p style="display:none;">
    <label for="id_honeypot">Never send a human to do a machine's job</label>
    <input type="text" name="honeypot" id="id_honeypot" />
  </p>

我是否认为更改此元素的默认值会增强其反垃圾邮件功能?我尝试在django/contrib/comments/forms.py中修改它,如下所示:

class CommentForm(CommentDetailsForm):
    #use to be honeypot = forms.CharField(...
    website      = forms.CharField(required=False,
                                label=_('Never send a human to do a machines job')

def clean_honeypot(self):
    """Check that nothing's been entered into the honeypot."""
    value = self.cleaned_data["website"]
    if value:
        raise forms.ValidationError(self.fields["website"].label)
    return value

这成功地更改了django BUT生成的html中的nameid,然后整个机制停止工作 - 我尝试填充这个不可见的字段,提交并添加了评论。

我还有一些其他的想法,但首先我真的想让这个工作 - 是否可以修改默认的蜜罐nameid并让它像它应该的那样工作?

P.S我相信这样做的一个更优雅的方法是扩展django.contrib.comments并在那里编写修改代码,而不是处理实际的django代码 - 实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果有更多的时间来修补我找到了我的两个问题的答案:

为了修改标准蜜罐或创建自己的蜜罐,您必须通过添加CommentForm函数以及clean_NAME_OF_HONEYPOT变量来扩展NAME_OF_HONEYPOT类,这两个函数看起来都是与标准类似,您还必须覆盖security_errors函数,以在字典中包含新/修改过的蜜罐的名称。

执行此操作的最佳方法是按照此处所述创建自定义评论应用:https://docs.djangoproject.com/en/dev/ref/contrib/comments/custom/

我希望这个答案可以帮助我处理其他人。