2013-03-01 64 views
3

“意见”基本上我想一个办法有管理员离开正在浏览的模型意见。比方说,我们有一个模型车,我已经在管理网站上注册了,我想让其他管理员写一个关于这辆车的简短说明,并且只在管理界面中显示它们以及它们的名称和时间戳。形式在Django管理的“笔记”或模型

基本上我想在Django管理加评论的形式为特定模型。

如何做到这一点没有覆盖整个视图有什么建议?

回合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) 

我的用户模型处理两个管理员用户,这是我想添加笔记功能。我如何在创建的日期前添加登录用户名?

+0

要删除额外的字段,请在'NotesInline'中添加'extra = 0'。同样在你的'Note Note'中,没有ForeignKey将这个音符与对象(Car)链接起来。如果没有这个,笔记就不知道它留在哪里,只是谁写的,写的是什么,写什么的。 – GordonsBeard 2013-03-01 20:41:50

+0

'return“{1}创建了关于{0}的注释”。format(self.created_on,self.user.name)' – GordonsBeard 2013-03-01 20:42:43

+0

尽管如此,我正在使用用户模型的注释功能,但管理员未以该用户身份登录。 So Car = User,现在我想要一个作者=登录用户。我清楚了吗? – Chris 2013-03-01 20:44:42

回答

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在此之后!

网站/管理员。PY

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字段限制为当前登录的用户需要更多修补程序,而不是您应该打扰的。

如果您需要将管理控制台扩展到想要自动填写这些字段的位置,则必须创建其他公共视图,然后将访问权限限制为有权访问的用户它。无论是或者你将不得不自己重写管理视图/模板。这是Django管理面板的一个设计特性 - 它应该用于修改表格,不一定是最终用户输入面板。

一个比较头痛的: Django的syncdb不会改变已经存在的,所以如果你想添加/从现有模型中删除列,你需要删除并重新创建该表,或使用类似django-evolution表。然而,这是另一个问题的使用。

+0

这可能是要走的路。虽然我还没有完全想到它。我会用我的进度更多的信息更新我的原始问题。 – Chris 2013-03-01 20:16:26

-1

没有挖掘到的管理,最简单的方法是将注入注释形式与JavaScript的管理接口。您需要创建一个模型来存储评论(您可能可以使用内置的评论系统,虽然这可能比它的价值更麻烦),一些用于检索和保存评论的ajax,以及一个JavaScript小部件呈现检索到的评论和评论表单。

然后,您只需要在管理模板中包含对脚本的引用,而不必触摸任何管理员内部。

+0

感谢您的回答! – Chris 2013-03-01 21:22:00

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,并使用它填充BaseGenericInlineFormSet.sav中的“user”字段e_new()。以便登录的用户被正确记录。其他代码只是为了让它更像“评论”一样。例如,只读域,没有删除等

注2:这是一个通用的解决方案,所以无论我们要发表评论,哪种模式,只要加入

inlines = [CommentInline,] 

到管理类和我们很好去。

1

这是一个老问题,但我做了一个包重大启发由Dryice刘的工作在他的答案。

该软件包被称为django-admin-comments。这是很容易设置:

安装Django管理评论:

$ pip install django-admin-comments 

将它添加到您的INSTALLED_APPS

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

运行数据库迁移

$ manage.py migrate 

现在,只需添加CommentInline任何ModelAdmin

from admin_comments.admin import CommentInline 

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

就是这样!

拉请求欢迎,如果任何人在这个线程想成为一个贡献者只是打开公关添加自己的贡献者名单,我会接受并添加你。