我知道这是一个古老的职位,但以防万一有人到达这里,这是我的解决方案,通过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,]
到管理类和我们很好去。
要删除额外的字段,请在'NotesInline'中添加'extra = 0'。同样在你的'Note Note'中,没有ForeignKey将这个音符与对象(Car)链接起来。如果没有这个,笔记就不知道它留在哪里,只是谁写的,写的是什么,写什么的。 – GordonsBeard 2013-03-01 20:41:50
'return“{1}创建了关于{0}的注释”。format(self.created_on,self.user.name)' – GordonsBeard 2013-03-01 20:42:43
尽管如此,我正在使用用户模型的注释功能,但管理员未以该用户身份登录。 So Car = User,现在我想要一个作者=登录用户。我清楚了吗? – Chris 2013-03-01 20:44:42