sirjay
sirjay

Reputation: 1766

Django admin: how to save_model() in TabularInline?

I use Django 1.11.10 and python 3.6; I want create Item model in admin panel and add multiple File models at the same page, so I use TabularInline. The problem is before saving File models I need to fill out some other fields, for example size of uploaded file. If I use admin.ModelAdmin for class, then save_model would work, but it doesn't for 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)

Upvotes: 4

Views: 4358

Answers (2)

Saket
Saket

Reputation: 69

This is an old post but I found something that works. Adding it here as this is first search result.

Below code updates created_by field before saving tabular data.

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()

btw, it needs to be added in your ModelAdmin, and not TabularInline.

Upvotes: 3

zelenyjan
zelenyjan

Reputation: 703

look at save_related

I believe it's what you need

Upvotes: 3

Related Questions