(c) 2009 alerion.um с гмыла
Есть модель комментариев. Нужен интерфейс в админке для их модерирования. Модератор может только удалять комментарии, во избежания казусов "я такого не писал". Нужно убрать права на изменение записи и убрать все ссылки на страницу редактирования комментария.
Файл models.py
class Comment(BaseComment):
content_type = models.ForeignKey(ContentType, related_name="content_type_set_for_%(class)s")
object_id = models.TextField('object ID')
content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_id")
content_object.short_description = u'Статья'
user = models.ForeignKey(User, related_name='%(class)s_comments')
comment = models.TextField('Комментарий', max_length=COMMENT_MAX_LENGTH)
ip = models.IPAddressField('IP', editable=False)
created_at = models.DateTimeField('Добавлен', auto_now_add=True)
class Meta:
verbose_name = 'комментарий'
verbose_name_plural = 'комментарии'
def get_category(self):
'''
Возвращаем читабельное название раздела к которому принадлежит комментарий
'''
parts = {
'news': u'Новости',
'cinema': u'Киноафиша'
}
return parts[self.content_type.app_label]
get_category.short_description = u'Раздел'
Файл admin.py
class CommentAdmin(admin.ModelAdmin):
list_display = ('user', 'comment', 'get_category', 'content_object', 'ip', 'created_at')
list_select_related = True
search_fields = ('comment', 'user__username')
ordering = ('-created_at',)
def has_change_permission(self, request, obj=None):
'''
Если просто возвращать False, django даже не пусть на страницу
списка объектов, которая нам и нужна. Если obj не равно None, значит
пользователь пытается зайти на страницу редактирования, иначе - страницу
списка комменатариев.
'''
if obj:
return False
else:
return super(CommentAdmin, self).has_change_permission(request, obj=None)
def has_add_permission(self, request):
#Запрещаем добавление комментариев через админский интерфейс
return False
def changelist_view(self, request, extra_context=None):
'''
Этот метод возращает таблицу комментариев.
Вот здесь мы убираем ссылку на редактирование комментария на странице списка
комментариев. В __init__ не получается, потому где-то после него ставится
первая колонка по дефолту. (None,) потому что если передать пустой список,
в теге шаблона ссылка добавится на checkbox.
'''
self.list_display_links = (None,)
return super(CommentAdmin, self).changelist_view(request, extra_context=None)