2013-03-01 3 views
3

В принципе, я хочу, чтобы администраторы оставляли комментарии к просматриваемой модели. Предположим, у нас есть модельный автомобиль, который я зарегистрировал на сайте администратора, и я хочу, чтобы другие администраторы могли написать короткую заметку об этом автомобиле и показать его ТОЛЬКО В ИНТЕРФЕЙСЕ ADMIN вместе с их именем и меткой времени.Форма в Django Admin для «заметок» или «комментариев» на моделях

По сути, я хочу добавить форму комментария в администраторе django для конкретной модели.

Любые предложения о том, как это сделать без переопределения всего вида?

Round 2 (EDIT)

Это мой прогресс, используя GordonsBeards ответ.

how my admin looks now

Это добавляет 3 «лишние» пустые ноты, которые не дело выключатель, но не интересно тем не менее.

# In models.py 
class Note(models.Model): 
    user = models.ForeignKey(User) 
    note = models.TextField() 
    created_on = models.DateTimeField(auto_now_add=True) 

    def __unicode__(self): 
     return "created on: {}".format(self.created_on) 

Моя модель User управляет обоими пользователями-администраторами и является тем, на что я хочу добавить функциональность заметок. Как добавить имя пользователя, зарегистрированного в журнале, перед созданной на дату?

+0

Чтобы удалить дополнительные поля, в '' NotesInline' добавить 'extra = 0'. Также в вашем «классе Note» нет никакого ForeignKey, который связывает эту заметку с объектом (Car). Без этого записка не знает, где ее оставляют, только кто ее написал, что было написано и когда она была написана. – GordonsBeard

+0

'return '{1} created note on: {0}". Format (self.created_on, self.user.name) ' – GordonsBeard

+0

Это то, что я использую функциональность примечания для модели пользователя, но администратор не вошли в систему как этот пользователь. So Car = Пользователь, и теперь я хочу один, где Author = logged in User. Я достаточно ясно? – Chris

ответ

2

Я не знаю, что вы подразумеваете под «переопределением всего вида», потому что это то, что делает Django настолько изящным для использования, что позволяет зависеть от дополнительной функциональности без излишней суеты. Предполагая, что я не собираюсь вставлять всю свою ногу мне в рот, вот как я подхожу к ней:

Добавление заметок к чему-то не должно быть чрезмерно сложным, просто определите еще одну модель в вашем cars.models и добавьте что-то вроде Notes. Тогда просто используйте эту модель модели Cars, поскольку это внешний ключ и zippozappo - у вас есть некоторые заметки.

Что касается «ограничения» его только администратором, если ваши общедоступные представления не позволят людям добавлять заметки или отображать заметки, они не должны появляться за пределами приложения администратора.

сайт/models.py

from django.contrib.auth.models import User 
# snip your stuff... 
class Notes(models.Model) 
    user = models.ForeignKey('auth.User') 
    author = models.ForeinKey('auth.User') 
    note = models.TextField() 
    created_on = models.DateTimeField(auto_now_add=True) 

убедитесь ./manage syncdb после этого!

сайт/admin.ру

from site.models import Notes 
from django.contrib.auth.models import User 

class NotesInline(admin.StackedInline): 
    model = Notes 
    extra = 0 

class UserAdmin(UserAdmin): 
    inlines = [NotesInline,] 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

Вот некоторые примечания для использования встроенного материала администратора, в случае, если вы хотите, чтобы настроить отображение примечаний в конце каждого автомобиля: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.inlines

Конечно, вы можете расширить/изменить/измените это, как вам нравится, но вам не нужно делать ничего сложного, чтобы добавить некоторые дополнительные функции к вашим моделям.

В идеале вы бы создали приложение Notes, которое позволит вам прокомментировать любой объект, который вы хотите, а не только пользователи.

редактировать

class NotesInline теперь имеет extra=0. Это остановит 3 записи, отображаемые по умолчанию на странице пользователя.

class Notes имеет на нем author = models.ForeinKey('auth.User'), в котором вам необходимо отслеживать, кто оставил записку в первую очередь. Это добавит раскрывающийся список, который позволит вам выбрать, кто покидает заметку. Если я правильно понимаю, вы хотите, чтобы это поле было автоматически заполнено текущим пользователем. Проблема с форсированием этого заключается в том, что на панели администратора все админы создаются одинаково (если только они не ограничены разрешениями), поэтому для ограничения этого поля author текущему пользователю, которому вы входите в систему, потребуется больше вмешательства, чем вам следует беспокоиться.

Если вам необходимо расширить панель администратора до такой степени, что вы хотите автоматически заполнить эти поля, вам придется создать другое общедоступное представление, а затем ограничить доступ к тем пользователям, у которых есть разрешения на доступ Это. Либо, либо вам придется начать переопределять взгляды/шаблоны admin самостоятельно. Это своего рода встроенная функция админ-панели Django - она ​​должна использоваться для изменения ваших таблиц, не обязательно являясь панелью ввода всех пользователей.

еще одна головная боль: Джанго syncdb не будет изменять таблицы, которые уже существуют, так что если вы хотите добавить/удалить столбец из существующей модели, вам необходимо удалить и заново создать таблицу, или использовать что-то вроде django-evolution , Однако использование этого для другого вопроса.

+0

Возможно, это путь. Хотя я до сих пор не понял его полностью. Я уточню свой первоначальный вопрос с дополнительной информацией о моем прогрессе. – Chris

-1

Не вдаваясь в админ, самым простым способом было бы ввести форму комментариев в админ-интерфейсы с помощью javascript. Вам нужно будет создать модель для хранения комментариев (возможно, вы сможете использовать встроенную систему комментариев, хотя это может быть больше проблем, чем ее ценность), некоторые ajax для извлечения и сохранения комментариев и виджет javascript, который визуализировать полученные комментарии и форму комментариев.

Тогда вам просто нужно включить ссылку на скрипт в шаблонах администратора и не прикасаться ни к одному из внутренних элементов администраторов.

+0

Спасибо за ответ! – Chris

1

Я знаю, что это старый пост, но только в том случае, если кто достиг здесь, вот мое решение, вдохновленный Django: How to get current user in admin forms:

models.py:

class Comment(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey("content_type", "object_id") 
    user = models.ForeignKey(User) 
    content = models.TextField() 
    time = models.DateTimeField(auto_now_add=True) 

admin.py:

class CommentInlineForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(CommentInlineForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.pk: 
      self.fields['content'].widget.attrs['readonly'] = True 


class CommentInlineFormset(BaseGenericInlineFormSet): 
    def save_new(self, form, commit=True): 
     setattr(form.instance, "user", self.current_user) 
     return super(CommentInlineFormset, self).save_new(
      form, commit=True) 


class CommentInline(GenericTabularInline): 
    model = Comment 
    extra = 1 
    form = CommentInlineForm 
    formset = CommentInlineFormset 
    readonly_fields = ('user', 'time') 

    def has_delete_permission(self, request, obj=None): 
     return False 

    def get_formset(self, request, obj=None, **kwargs): 
     formset = super(CommentInline, self).get_formset(
      request, obj, **kwargs) 
     formset.current_user = request.user 
     return formset 

Примечание 1: Ключ здесь состоит в том, чтобы перезаписать GenericTabularInline.get_formset() для передачи в request.user и использовать его для заполнения поля «user» в BaseGenericInlineFormSet.sav e_new(). Чтобы зарегистрированный пользователь регистрировался правильно. Другой код находится там, чтобы сделать его более «комментариями». Например, только для чтения полей, не удалять и т.д.

Примечание 2: Это общее решение, поэтому независимо от того, какую модель мы хотим прокомментировать, просто добавьте

inlines = [CommentInline,] 

к классу администратора и мы хорошо идти.

1

Это старый вопрос, но я сделал пакет тяжело вдохновленный работой Сушица Лю в его ответе.

Пакет называется django-admin-comments. Это довольно легко установить:

Установка Django администратора Комментарии:

$ pip install django-admin-comments 

Добавить его в INSTALLED_APPS:

INSTALLED_APPS = (
    ... 
    'admin_comments', 
    ... 
) 

миграции базы данных Run

$ manage.py migrate 

Теперь, просто добавьте CommentInline любым ModelAdmin

from admin_comments.admin import CommentInline 

class MyModelAdmin(admin.ModelAdmin): 
    model = MyModel 
    inlines = [CommentInline,] 

Вот и все!

Запросите приглашение, и если кто-нибудь из этой темы хотел бы стать вкладчиком, просто откройте PR, добавив себя в список участников, и я приму и добавлю вас.

Смежные вопросы