Django 1.5 ModelForm как администратор с изображениями и внешним ключом

У меня есть следующие модели:

class Quiver(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)
    is_default = models.BooleanField(default=False)
    type = models.CharField(max_length=1, choices=QUIVER_TYPES)
    category = models.CharField(max_length=255, choices=QUIVER_CATEGORIES)

    def __unicode__(self):
        return u'[%s] %s %s quiver' % (
            self.user.username,
            self.get_type_display(),
            self.get_category_display())


class Image(models.Model):
    photo = models.ImageField(upload_to=get_upload_file_path)
    is_cover = models.BooleanField(default=False)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    def save(self, *args, **kwargs):
        try:
            this = Image.objects.get(pk=self.pk)
            if this.photo != self.photo:
                this.photo.delete(save=False)
        except Image.DoesNotExist:
            pass

        super(Image, self).save(*args, **kwargs)


class Surfboard(models.Model):
    quiver = models.ForeignKey(Quiver)
    brand = models.CharField(max_length=255)
    model = models.CharField(max_length=255)
    length = models.CharField(max_length=255)
    width = models.CharField(max_length=255, blank=True)
    thickness = models.CharField(max_length=255, blank=True)
    volume = models.CharField(max_length=255, blank=True)
    images = generic.GenericRelation(Image)

    def __unicode__(self):
        return u'%s %s %s' % (self.length, self.brand, self.model)

    def get_cover_image(self):
        "Returns the cover image from the images uploaded or a default one"
        for image in self.images.all():
            if image.is_cover:
                return image

        return None

Я хотел бы иметь возможность иметь ту же форму, что и у администратора в моем интерфейсе /surfboard/add:

добавить доску для серфинга с внешним ключом в раскрывающемся списке и добавить изображения

Как новый фанат и пользователь Django, я начал создавать форму с нуля. Не имея возможности сделать то, что я хочу, с включением внешнего ключа "quiver" в качестве раскрывающегося списка, я нашел в документе ModelForm и решил использовать его, так что вот что я получил:

class SurfboardForm(ModelForm):
    class Meta:
        model = Surfboard

На мой взгляд, это выглядит так, и это уже хорошее начало:

Итак, теперь я хотел иметь возможность добавлять фотографии одновременно, и они связаны с доской для серфинга через общие отношения. Здесь я не нахожу способ сделать реализацию, как в админе, и разочарован. Любые советы, чтобы сделать это?

Спасибо!

1 ответ

Решение

То, что вы ищете, называется встроенным набором форм - см. Документы для получения дополнительной информации.

Также удобно, что вы можете быстро визуализировать набор форм с помощью {{ formset.as_p }}, но вам нужно написать некоторый JavaScript (или использовать JavaScript, который используется в админке Django) для обработки добавления и удаления форм.

Другие вопросы по тегам