Django 管理员:如何在 TabularInline 中 save_model() ?

问题描述 投票:0回答:2

我使用 Django 1.11.10 和 python 3.6;我想在管理面板中创建

Item
模型并在同一页面添加多个
File
模型,所以我使用
TabularInline
。问题是在保存
File
模型之前,我需要填写一些其他字段,例如上传文件的
size
。如果我在课堂上使用
admin.ModelAdmin
,那么
save_model
会起作用,但它不适用于
admin.TabularInline

class Item(models.Model):
    title = models.CharField()

class File(models.Model):
    name = models.CharField()
    size = models.PositiveIntegerField()
    file = models.FileField(upload_to='x/')


----


class FileForm(forms.ModelForm):
    class Meta:
        model = File
        fields = ['name', 'file']

    def clean(self):
        cleaned_data = super().clean()
        file = cleaned_data.get('file')

        self.size = file.size # file.size shows correct result

class FileInline(admin.TabularInline):
    model = File
    form = FileForm

    def save_formset(self, request, form, formset, change):
        logger.info('-- does not get here --')
        formset.save_m2m()

    def save_model(self, request, obj, form, change):
        logger.info('-- does not get here --')
        obj.size = form.size
        super(FileInline, self).save_model(request, obj, form, change)

class ItemAdmin(admin.ModelAdmin):
    inlines = [FileInline]


admin.site.register(Item, ItemAdmin)
python django django-admin
2个回答
3
投票

查看保存相关

我相信这就是你所需要的


3
投票

这是一篇旧文章,但我发现了一些有用的东西。将其添加到此处,因为这是第一个搜索结果。

下面的代码在保存表格数据之前更新

created_by
字段。

def save_formset(self, request, obj, formset, change):
    instances = formset.save(commit=False)
    for instance in instances:
        instance.created_by = request.user
        instance.save()
        formset.save()

顺便说一句,它需要添加到您的 ModelAdmin 中,而不是 TabularInline。

© www.soinside.com 2019 - 2024. All rights reserved.