Reputation: 1766
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
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