我知道這是一個古老的職位,但以防萬一有人到達這裏,這是我的解決方案,通過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