Customizing django-comments-xtd¶
django-comments-xtd can be extended in the same way as django-contrib-comments. There are three points to observe:
The setting
COMMENTS_APPmust be'django_comments_xtd'.The setting
COMMENTS_XTD_MODELmust be your model class name, i.e.:'mycomments.models.MyComment'.The setting
COMMENTS_XTD_FORM_CLASSmust be your form class name, i.e.:'mycomments.forms.MyCommentForm'.
In addition to that, write an admin.py module to see the new comment class in the admin interface. Inherit from django_commensts_xtd.admin.XtdCommentsAdmin. You might want to add your new comment fields to the comment list view, by rewriting the list_display attribute of your admin class. Or change the details view customizing the fieldsets attribute.
Custom Comments Demo¶
The demo site custom_comments available with the source code in GitHub (directory django_comments_xtd\demos\custom_comments) implements a sample Django project with comments that extend django_comments_xtd with an additional field, a title.
settings Module¶
The settings.py module contains the following customizations:
INSTALLED_APPS = (
# ...
'django_comments_xtd',
'django_comments',
'articles',
'mycomments',
# ...
)
COMMENTS_APP = "django_comments_xtd"
COMMENTS_XTD_MODEL = 'mycomments.models.MyComment'
COMMENTS_XTD_FORM_CLASS = 'mycomments.forms.MyCommentForm'
models Module¶
The new class MyComment extends django_comments_xtd’s XtdComment with a title field:
from django.db import models
from django_comments_xtd.models import XtdComment
class MyComment(XtdComment):
title = models.CharField(max_length=256)
forms Module¶
The forms module extends XtdCommentForm and rewrites the method get_comment_create_data:
from django import forms
from django.utils.translation import ugettext_lazy as _
from django_comments_xtd.forms import XtdCommentForm
from django_comments_xtd.models import TmpXtdComment
class MyCommentForm(XtdCommentForm):
title = forms.CharField(
max_length=256,
widget=forms.TextInput(attrs={'placeholder': _('title')})
)
def get_comment_create_data(self):
data = super(MyCommentForm, self).get_comment_create_data()
data.update({'title': self.cleaned_data['title']})
return data
admin Module¶
The admin module provides a new class MyCommentAdmin that inherits from XtdCommentsAdmin and customize some of its attributes to include the new field title:
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django_comments_xtd.admin import XtdCommentsAdmin
from custom_comments.mycomments.models import MyComment
class MyCommentAdmin(XtdCommentsAdmin):
list_display = ('thread_level', 'title', 'cid', 'name', 'content_type',
'object_pk', 'submit_date', 'followup', 'is_public',
'is_removed')
list_display_links = ('cid', 'title')
fieldsets = (
(None, {'fields': ('content_type', 'object_pk', 'site')}),
(_('Content'), {'fields': ('title', 'user', 'user_name', 'user_email',
'user_url', 'comment', 'followup')}),
(_('Metadata'), {'fields': ('submit_date', 'ip_address',
'is_public', 'is_removed')}),
)
admin.site.register(MyComment, MyCommentAdmin)
Templates¶
You will need to customize the following templates:
comments/form.htmlto include new fields.
comments/preview.htmlto preview new fields.
django_comments_xtd/email_confirmation_request.{txt|html}to add the new fields to the confirmation request, if it was necessary. This demo overrides them to include thetitlefield in the mail.
django_comments_xtd/comments_tree.htmlto show the new field when displaying the comments. If your project doesn’t allow nested comments you can use either this template or comments/list.html`.
django_comments_xtd/reply.htmlto show the new field when displaying the comment the user is replying to.
Modifying comments with code¶
Here’s an example of how to access the underlying model storing your comments:
from django_comments_xtd.models import XtdComment
from django.contrib.contenttypes.models import ContentType
def unbsubscribe_everyone(model_instance):
content_type = ContentType.objects.get_for_model(model_instance)
XtdComment.objects\
.filter(content_type=content_type, object_pk=model_instance.pk)\
.update(followup=False)