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)
look at save_related
I believe it's what you need
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With