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