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)