これは古い投稿であることは知っていますが、誰かがここに到達した場合に備えて、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.save_new() の「user」フィールドに入力することです。ログインしたユーザーが正しく記録されるようにします。他のコードは、「コメント」のようにするためのものです。たとえば、読み取り専用フィールド、削除なしなど。
注 2: これは一般的な解決策であるため、コメントするモデルに関係なく、追加するだけです
inlines = [CommentInline,]
admin クラスに移動します。