在Django管理员中同一表单中添加对象及其相关对象

0 投票
1 回答
998 浏览
提问于 2025-04-17 06:23

我有这些模型:

class Gallery(models.Model):
   HeadImage = models.ImageField(upload_to="gallery") 

class Image(models.Model):
   Image = models.ImageField(upload_to="gallery")
   Gallery = models.ForeignKey(Gallery, related_name='images',blank=True)

class Agency(models.Model):
   # some fields ...
   Gallery=models.ForeignKey(Gallery)

现在我想在添加一个代理机构(Agency)时,不想只显示一个简单的下拉框来选择画廊(Gallery)字段,而是想要一些更好的东西:

我希望在画廊模型中的HeadImage字段有一个文件上传功能,并且在图片模型中的Image字段有一组文件上传功能。也就是说,我想在一个表单里同时添加一个代理机构(Agency)及其相关的对象(与代理机构相关的画廊和与画廊相关的图片)。我该怎么做呢?我在网上搜索了很多,但没有找到解决办法,这真是个让人头疼的问题。

补充说明:我想在同一个表单里保存一个画廊及其一组图片,同时保存代理机构及其画廊。

谢谢任何帮助!

1 个回答

1

正如我在上面的评论中提到的,你在Django的管理后台里尝试做的事情有点多。

你其他的问题来看,你已经熟悉了写自己视图所需的工具。你可以为你的模型定义表单,把它们放在同一个表单标签里。如果表单有效,就用commit=False保存,然后再处理外键。

这里有一个简单的视图示例,可以同时添加一个Agency和一个Gallery。你也可以很容易地同时添加一组图片的表单。

def add_agency(request):
    if request.method == "POST":
        agency_form = AgencyForm(data=request.POST, prefix="agency")
        gallery_form = GalleryForm(data=request.POST, prefix="gallery")
        if agency_form.is_valid() and gallery_form.is_valid():
            gallery = gallery_form.save()
            agency = agency_form.save(commit=False)
            agency.gallery = gallery
            agency.save()
            return HttpResponseRedirect(next_url)
    else:
        # left as an exercise

如果你想要一个两步的表单,我建议你看看formwizard。这是一个独立的应用,适用于Django版本<=1.3.X,而在Django版本>=1.4中已经包含

撰写回答