Django admin-通过内联自动保存当前用户以进行建模吗? [英] Django admin - Auto save current user to model via inlines?
问题描述
我有以下内容,当我尝试通过管理页面上传文档以继续时,它引发错误。使用内联时,如何自动填充文档模型的enter_by字段?
I have the following and it throws an error when I attempt to upload a document via the admin page for Proceeding. How can I auto populate the entered_by field for the Document model when using an inline?
错误:
IntegrityError位于/ admin / myapp / proceeding / 6 / change /
(1048,列'entered_by_id'不能为空)
Error: IntegrityError at /admin/myapp/proceeding/6/change/ (1048, "Column 'entered_by_id' cannot be null")
# models.py
class Proceeding(models.model):
date = models.DateField()
entered_by = models.ForeignKey(User)
class Document(TimeStampedUserModel):
proceeding = models.ForeignKey(Proceeding)
document = models.FileField(upload_to='documents/')
entered_by = models.ForeignKey(User)
#admin.py
class DocumentAdmin(admin.ModelAdmin):
fields = ('proceeding', 'document', )
list_display = ('proceeding', 'entered_by', )
def save_model(self, request, obj, form, change):
instance = form.save(commit=False)
instance.entered_by = request.user
instance.save()
form.save_m2m()
return instance
def save_formset(self, request, form, formset, change):
def set_user(instance):
instance.entered_by = request.user
instance.save()
if formset.model == Document:
instances = formset.save(commit=False)
map(set_user, instances)
formset.save_m2m()
return instances
else:
return formset.save()
class DocumentInline(admin.TabularInline):
model = Document
fields = (
'proceeding',
'document',
)
extra = 0
class ProceedingAdmin(admin.ModelAdmin):
inlines = [DocumentInline, ]
fields = ('date',)
list_display = ('date', 'entered_by', )
def save_model(self, request, obj, form, change):
instance = form.save(commit=False)
instance.entered_by = request.user
instance.save()
form.save_m2m()
return instance
def save_formset(self, request, form, formset, change):
def set_user(instance):
instance.entered_by = request.user
instance.save()
if formset.model == Proceeding:
instances = formset.save(commit=False)
map(set_user, instances)
formset.save_m2m()
return instances
else:
return formset.save()
推荐答案
文档中的示例中的 save_formset
显示了如何执行此操作。使用 commit = False
保存表单集,然后遍历实例并将 entered_by
字段设置为 request.user
。
The example in the docs for save_formset
shows how to do this. Save the formset with commit=False
, then iterate through the instance and set the entered_by
field to request.user
.
class ProceedingAdmin(admin.ModelAdmin):
...
def save_formset(self, request, form, formset, change):
instances = formset.save(commit=False)
for obj in formset.deleted_objects:
obj.delete()
for instance in instances:
instance.entered_by = request.user
instance.save()
formset.save_m2m()
请注意,您的 DocumentAdmin
不需要 save_formset
方法,因为它没有任何内联。
Note that your DocumentAdmin
doesn't need a save_formset
method, since it doesn't have any inlines.
这篇关于Django admin-通过内联自动保存当前用户以进行建模吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!