Django Admin中的表格,用于;附注;或;评论“;关于模型

Django Admin中的表格,用于;附注;或;评论“;关于模型,django,django-models,django-admin,Django,Django Models,Django Admin,基本上,我想要一种让管理员对正在查看的模型留下评论的方法。假设我们有一辆模型车,我已经在管理员网站上注册了,我想让其他管理员写一个关于这辆车的简短说明,让它只显示在管理员界面上以及他们的名字和时间戳 本质上,我想在django管理员中为特定模型添加一个注释表单 有没有关于如何在不覆盖整个视图的情况下执行此操作的建议 第二轮(编辑) 这是我使用GordonsBeards答案的进度 它增加了3张“额外”的空钞票,这不是交易的破坏者,但仍然很有趣 # In models.py class Note(

基本上,我想要一种让管理员对正在查看的模型留下评论的方法。假设我们有一辆模型车,我已经在管理员网站上注册了,我想让其他管理员写一个关于这辆车的简短说明,让它只显示在管理员界面上以及他们的名字和时间戳

本质上,我想在django管理员中为特定模型添加一个注释表单

有没有关于如何在不覆盖整个视图的情况下执行此操作的建议

第二轮(编辑)

这是我使用GordonsBeards答案的进度

它增加了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)

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

如果不深入管理,最简单的方法是使用javascript将注释表单插入管理界面。您需要创建一个模型来存储注释(您可能能够使用内置的注释系统,尽管这可能比它的价值更麻烦),一些用于检索和保存注释的ajax,以及一个用于呈现检索到的注释和注释表单的javascript小部件


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

我不知道您所说的“覆盖整个视图”是什么意思,因为这种事情使Django使用起来非常方便,能够在不太麻烦的情况下插入额外的功能。假设我不打算把我的整个脚放进嘴里,我会这样做:

添加注释并不太困难,只需在
汽车中定义另一个模型。模型
并添加类似
注释
的内容即可。然后让这个模型参考汽车模型,因为它是外键和zippozappo-你有一些笔记

至于“限制”它仅限于管理员,除非您的公共视图允许人们添加注释或显示注释,否则它不应该出现在管理员应用程序之外

site/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)
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)
确保在此之后
/manage syncdb

站点/admin.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)
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)
以下是一些使用内联管理功能的注意事项,以防您希望自定义每辆车末尾的注意事项显示:

当然,您可以按自己的喜好扩展/更改/更改此功能,但您不必做任何棘手的事情来为模型添加一些附加功能

理想情况下,你应该创建一个Notes应用程序,它可以让你评论任何你想要的对象,而不仅仅是用户

编辑

class NotesInline
现在有一个
extra=0
。这将阻止3条记录默认显示在用户页面上

class Notes
上有一个
author=models.ForeinKey('auth.User')
,您需要首先跟踪谁留下了便笺。这将添加一个下拉框,让您选择留下便条的人。如果我理解正确,您希望当前登录的用户自动填写此字段。强制执行此操作的问题是,在“管理”面板上,所有管理员都是平等创建的(除非受权限限制),因此要将此
author
字段限制为当前登录的用户,需要进行更多的修改

如果需要将“管理”面板扩展到要自动填写这些字段的位置,则必须创建一些其他公共视图,然后将访问权限限制为具有访问权限的用户。或者您必须自己开始覆盖管理视图/模板。这是Django管理面板的一种按设计的功能—它应该用于修改表,而不一定是最终用户输入面板

还有一个头疼的问题:
Django的
syncdb
不会更改已经存在的表,因此如果要从现有模型中添加/删除列,则需要删除并重新创建该表,或者使用类似的方法。不过,这是另一个问题。

我知道这是一篇老文章,但万一有人到了这里,以下是我的解决方案,灵感来自:

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.save_new()中的“user”字段。以便正确记录已登录的用户。其他代码只是为了让它更像“注释”。例如,只读字段、不删除等

注2:这是一个通用的解决方案,所以无论我们想评论哪种模型,只需添加

inlines = [CommentInline,]

这是一个老问题,但我在很大程度上受到了Dryce Liu在回答中的工作的启发

该包被称为。设置起来很容易:

安装Django管理员注释:

$ pip install django-admin-comments
将其添加到您的
已安装的应用程序中

INSTALLED_APPS = (
    ...
    'admin_comments',
    ...
)
运行数据库迁移

$ manage.py migrate
现在,只需将
CommentInline
添加到任何
ModelAdmin

from admin_comments.admin import CommentInline

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


欢迎拉取请求,如果此线程中的任何人希望成为贡献者,只需打开一个PR,将自己添加到贡献者列表中,我将接受并添加您。

有关注释,您现在可以添加帮助文本:

date = models.DateTimeField('date', help_text="This is a help text")

这可能就是我们要走的路。虽然我还没有完全弄明白。我将更新我的原始问题,并提供有关我的进度的更多信息。要删除额外字段,请在您的
备注行中添加
extra=0
。此外,在您的
课堂笔记上
没有将此笔记与对象(汽车)链接的外键。没有这个,便条不知道它在哪里