Django 详细信息页面上多个关系的表单

Django 详细信息页面上多个关系的表单,django,forms,manytomanyfield,inline-formset,detailview,Django,Forms,Manytomanyfield,Inline Formset,Detailview,我有以下(简化)模型: 我想显示一个地段详细信息页面,其中列出了该地段的所有信息,包括与该地段相关的想法。这很简单 然而,除此之外,我希望用户能够从这个页面添加一个新的想法。提交后,用户应返回批次详细信息页面,将其新想法作为列表的一部分 我尝试过为新想法使用内联表单集,但它只显示为现有想法的下拉列表,不允许创建新想法。另外,这似乎有些过分,因为我只需要用户能够添加新想法,而不是编辑/删除已提交的想法。我也不需要他们能够编辑其他批次信息,只需要添加相关的想法 我知道可能有一个简单的方法来实现这一点

我有以下(简化)模型:

我想显示一个地段详细信息页面,其中列出了该地段的所有信息,包括与该地段相关的想法。这很简单

然而,除此之外,我希望用户能够从这个页面添加一个新的想法。提交后,用户应返回批次详细信息页面,将其新想法作为列表的一部分

我尝试过为新想法使用内联表单集,但它只显示为现有想法的下拉列表,不允许创建新想法。另外,这似乎有些过分,因为我只需要用户能够添加新想法,而不是编辑/删除已提交的想法。我也不需要他们能够编辑其他批次信息,只需要添加相关的想法

我知道可能有一个简单的方法来实现这一点,但我现在有点卡住了

任何帮助都将不胜感激

谢谢


编辑:我不是指Django管理员。这适用于面向用户的表单

外键/M2M字段旁边应该有一个可单击的绿色
+
标记。这将允许您创建一个新的
想法
,然后返回到
批次
实例

下面是一个示例(对
ManyToManyField
使用
filter\u horizontal
):


我发现了一个可行的解决方案:(参考:)


谢谢你的回答。但我不是说管理员。我也不想转到另一页添加新想法。我需要让它发生在同一页上。@Douglas:我明白了。我认为默认的管理行为是为新项目打开一个新窗口/选项卡,然后在保存时用它自动填充原始表单。如果这足够好的话,你可以看看管理员做了什么,然后复制它。不管怎样,我认为没有简单的解决方案,除非你能找到一个在模型表单上提供此功能的应用程序。@Douglas:这里有一个,但不幸的是,它没有一个有用的答案。我想我可能在这里找到了我自己问题的答案:。我将对此进行测试,看看它是否能按需要工作
class Idea(models.Model):
    tagline = models.TextField()

class Lot(models.Model):
    address = models.CharField()
    ...other fields...
    ideas = models.ManyToManyField(Idea)
class LotDisplay(DetailView):
    model = Lot

    def get_context_data(self, **kwargs):
        context = super(LotDisplay, self).get_context_data(**kwargs)
        context['form'] = IdeaForm()
        return context

class LotAddIdeaView(FormView, SingleObjectMixin):
    model=Lot
    form_class = IdeaForm
    template_name = 'lotxlot/lot_detail.html'

    def post(self, request, *args, **kwargs):
        if not request.user.is_authenticated():
            request.session['post'] = request.POST
            url = "%s?next=%s" % (reverse('account_login'), request.path)
            return HttpResponseRedirect(url)
        else:
            self.object = self.get_object()
            return super(LotAddIdeaView, self).post(request, *args, **kwargs)

    def get_success_url(self):
        return reverse('lotxlot_lot_detail', kwargs={'pk': self.object.pk})

    def form_valid(self, form):
        """
         Auto-populate user
        and save form.
        """
        instance = form.save(commit=False)
        instance.user = self.request.user
        instance.save()
        instance.lots.add(self.object)
        instance.save()

        return HttpResponseRedirect(self.get_success_url())

class LotDetailView(View):
    def get(self, request, *args, **kwargs):
        view = LotDisplay.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = LotAddIdeaView.as_view()
        return view(request, *args, **kwargs)