Django admin-通过内联自动保存当前用户以进行建模吗? [英] Django admin - Auto save current user to model via inlines?

查看:219
本文介绍了Django admin-通过内联自动保存当前用户以进行建模吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下内容,当我尝试通过管理页面上传文档以继续时,它引发错误。使用内联时,如何自动填充文档模型的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆