【问题标题】:Django-Admin TabularInline modify inline item attribute before saveDjango-Admin TabularInline 在保存前修改内联项属性
【发布时间】:2019-08-16 07:25:35
【问题描述】:

您好,我需要能够将当前用户添加到正在保存或修改的内联对象。我正在使用 django-admin 仪表板,因为此应用程序不是面向公众的。

class Med(models.Model):
    generic_name = models.CharField(max_length=33)
    last_updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)

    def save_model(self, request, obj, form, change):
            try:
                obj.last_updated_by = request.user
            except AttributeError:
                obj.last_updated_by = None
            super().save_model(request, obj, form, change)

class Comment(models.Model):
    text = models.TextField(("Comment"), max_length = 1000, null=False)
    med = models.ForeignKey(Med, related_name="comments", on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super().save_model(request, obj, form, change)

class CommentInline(admin.TabularInline):
    model = Comment
    extra = 0

class Med(admin.ModelAdmin):
    inlines = (CommentInline,)

我也尝试过覆盖 save_related 函数,但它包含的 CommentFormSet 对象似乎是所有对象,而不是被修改或保存的对象:

'_queryset': <QuerySet [<Comment: test>, <Comment: another test>]>,

关于这个主题的一些 SO 帖子已经过时,也没有足够的信息来推断一个有效的 save_related 实现。

【问题讨论】:

    标签: django django-admin django-admin-tools django-admin-actions


    【解决方案1】:

    我认为您正在寻找覆盖的方法是save_formset。此方法在 AdminModel 中的每个内联调用一次,并保存内联对象。

    你可以这样使用它:

    class Med(admin.ModelAdmin):
        inlines = (CommentInline,)
    
        def save_formset(self, request, form, formset, change):
            for inline_form in formset.forms:
                if inline_form.has_changed():
                    inline_form.instance.user = request.user
            super().save_formset(request, form, formset, change)
    

    这会将当前用户添加到正在修改的对象中。

    【讨论】:

    • 我将id 字段添加为只读,但现在,每次更新表单时都会丢失id,这会导致错误。同时更新内联数据。
    【解决方案2】:

    请注意,这个解决方案也对我有用:

    class MedAdmin(admin.ModelAdmin):
        inlines = (CommentInline,)
    
        def save_related(self, request, form, formsets, change):
            for formset in formsets:
                list_comment = formset.save(commit=False)
                for comment in list_comment:
                    comment.user = request.user
            return super().save_related(request, form, formsets, change)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-22
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多