data of foreign keys are not saving in django admin nested inlines

232 views Asked by At

I'm trying to build a list of replicable fields where the order can be interchanged. To do so I've built three different models Multicap Multitext Multimg which are Inlines of the model Multis which is an Inline of the model Delta.

I'm using django-nested-admin and everything works fine on the admin page, I can add new objects and change their order.

The problem I have is that when I populate the fields, save the model and then check its content, all the data of the text fields are turned into zeros 0.

enter image description here

instead, when I try to save the image I get this error:

AttributeError: 'int' object has no attribute 'field'

models.py

class Multis(models.Model):
    name = models.TextField(max_length=50, null=True, blank=True)
    delta = models.ForeignKey('Delta', related_name="delta", null=True, on_delete=models.CASCADE)

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return str(self.name)

class Multicap(models.Model):
    caption = models.TextField(max_length=50, null=True, blank=True)
    multic = models.ForeignKey('Multis', related_name="multicap", null=True, on_delete=models.CASCADE)

    class Meta:
        ordering = ('caption',)

    def __str__(self):
        return str(self.caption)


class Multimg(models.Model):
    img = models.ImageField(upload_to="images", verbose_name='Image', null=True, blank=True,)
    multim = models.ForeignKey('Multis', related_name="multimg", null=True, on_delete=models.CASCADE)

    class Meta:
        ordering = ('img',)

    @property
    def img_url(self):
      if self.img and hasattr(self.img, 'url'):
        return self.img.url

    def get_image_filename(instance, filename):
        title = instance.post.title
        slug = slugify(title)
        return "post_images/%s-%s" % (slug, filename)

    def get_absolute_url(self):
        return reverse('delta-detail', kwargs={'pk': self.pk})


class Multitext(models.Model):
    text = tinymce_models.HTMLField(null=True, blank=True)
    multit = models.ForeignKey('Multis', related_name="multitext", null=True, on_delete=models.CASCADE)

    class Meta:
        ordering = ('text',)

    def __str__(self):
        return str(self.text)

class Delta(models.Model):
    heading = models.CharField(max_length=50, null="true")
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        ordering = ('heading',)

    def __str__(self):
        return str(self.heading)

    def get_absolute_url(self):
        return reverse('delta-detail', kwargs={'pk': self.pk})

admin.py

from django.contrib import admin
import nested_admin
from nested_admin import SortableHiddenMixin, NestedTabularInline, NestedModelAdmin, NestedStackedInline
from .models import Delta, Multimg, Multitext, Multicap, Multis


class MimgAdmin(nested_admin.NestedStackedInline):
    model = Multimg
    sortable_field_name = "img"
    extra = 0

class MtxtAdmin(nested_admin.NestedStackedInline):
    model = Multitext
    sortable_field_name = "text"
    extra = 0

class McapAdmin(nested_admin.NestedStackedInline):
    model = Multicap
    sortable_field_name = "caption"
    extra = 0

class MAdmin(nested_admin.SortableHiddenMixin, nested_admin.NestedStackedInline):
    model = Multis
    sortable_field_name = "name"
    extra = 0
    inlines = [ McapAdmin, MtxtAdmin, MimgAdmin ]


@admin.register(Delta)
class DeltaAdmin(nested_admin.NestedModelAdmin):
    sortable_field_name = "delta"
    inlines = [ MAdmin ]
1

There are 1 answers

0
Lorenzo Scodeller On

Solved. It was a stupid error related to sortable_field_name

This field needs to be related to a field in the model which has to be formulated this way:

models.py

position = models.PositiveSmallIntegerField("Position", null=True)

admin.py

sortable_field_name = 'position'

This forms a position field that has a basic value of 0. Doing the way I was doing so this value was being substituted for the field I wanted to fill in.

Hope this can help someone occuring in the same error