2013-05-09 68 views
1

我有以下型号管理:的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 

我希望能有相同的形式,我在管理我的前端视图/冲浪板/加:

add surfboard with foreign key in dropdown and add images

作为一个新的Django风扇和用户,我开始从头创建表单。不能够做我想做的与包括外键“颤动”的下拉列表中,我的文档中的ModelForm发现,并决定使用它,所以在这里我得到了什么:

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

在我看来,它看起来像这一点,它已经是一个良好的开端:

enter image description here

所以,现在,我想有办法的同时添加图片,它们通过一个通用的关系连接到冲浪板。在这里,我没有找到像管理员那样执行实施的方式,并且感到沮丧。任何提示要这样做?

谢谢!

回答

3

您所寻求的内容称为内嵌式表单集 - 有关更多信息,请参阅the docs

您也可以使用{{ formset.as_p }}快速渲染窗体,但您需要编写一些JavaScript(或使用Django管理器中使用的JavaScript)来处理添加和删除表单。

+0

太棒了,谢谢!这听起来像我真正需要的,今晚我会尝试,至少现在添加一个图像,稍后当一切正常工作时添加javascript。 – Dachmt 2013-05-09 20:30:22