Ограничьте количество запросов, отображаемых для администратора django Inline
В django admin, используя django 1.2, я пытаюсь добавить InlineModelAdmin, чтобы применить комментарий к сохранению при внесении изменений в запись. (Ожидается, что в записи будет "ChangeComment" для каждого редактирования).
Я не хочу показывать предыдущие записи, поэтому я пытаюсь сделать changeCommentInline formet.queryset пустым, создав NoCommentsInlineFormset и назначив набор форм в моей ChangeCommentInline, но все еще возвращает существующие записи.
https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#changing-the-queryset
Примечание. В приведенной выше ссылке они используют BaseModelFormset, я использую BaseInlineFormset, который, как я ожидаю, может быть проблемой. Если я заменил BaseInlineFormset на BaseModelFormset, я получаю сообщение об ошибке "экземпляр" не существует.
admin.py
class NoCommentsInlineFormset(models.BaseInlineFormset):
def __init__(self, *args, **kwargs):
super(NoCommentsInlineFormset, self).__init__(*args, **kwargs)
self.queryset = ChangeComment.objects.none()
class ChangeCommentInline(admin.StackedInline):
model = ChangeComment
extra = 1
exclude = ("user", )
formset = NoCommentsInlineFormset
def save_model(self, request, obj, form, change):
"""auto-assign logined in user to comment"""
if not change:
obj.user = request.user
obj.save()
class EntryAdmin(admin.ModelAdmin):
inlines = (ChangeCommentInline, )
Можно ли ограничить записи ChangeComment, отображаемые в Inline, или есть лучший способ справиться с этим?
Ответы
Ответ 1
Как упоминалось в комментариях к benjaoming, необходимо было переопределить метод get_queryset()
в InlineModelAdmin
. Не нужно было переопределять и прикреплять новый набор форм к определению InlineModelAdmin
, как я думал изначально.
Вот результирующая реализация:
class ChangeCommentInline(admin.StackedInline):
"""For allowing logged in user to add change comment"""
model = ChangeComment
extra = 1
exclude = ("user", ) # auto-update user field in save_formset method of parent modeladmin.
def get_queryset(self, request):
"""Alter the queryset to return no existing entries"""
# get the existing query set, then empty it.
qs = super(ChangeCommentInline, self).get_queryset(request)
return qs.none()
Ответ 2
Я предполагаю, что вы используете
models.ForeignKey(EntryAdmin)
в вашей модели ChangeComment. но если вы хотите только один комментарий для каждого EntryAdmin, вместо этого следует использовать a:
models.OneToOneField(EntryAdmin)
И вам не понадобится NoCommentsInlineFormset или ваш встроенный класс.
Это то, что я буду делать.
отредактированы
Хорошо, если вы хотите сохранить историю комментариев, вы можете переопределить набор запросов в NoCommentsInlineFormset
как:
def __init__(self, *args, **kwargs):
super(NoCommentsInlineFormset, self).__init__(*args, **kwargs)
self.queryset = ChangeComment.objects.order_by('-created_at')[:1]
Это должно работать.