我有以下(简化)模型:
class Idea(models.Model):
tagline = models.TextField()
class Lot(models.Model):
address = models.CharField()
...other fields...
ideas = models.ManyToManyField(Idea)
我想显示一个Lot详细信息页面,其中列出了有关该批次的所有信息,包括与该批次相关的想法。这很简单。
然而,此外,我希望用户能够从该页面为该批次添加新想法。提交后,用户应返回批次详细信息页面,其新想法现在是列表的一部分。
我已经为新想法尝试了内联表单集,但这只是显示为现有想法的下拉,它不允许创建新想法。此外,它似乎有点矫枉过正,因为我只需要用户能够添加新想法,而不是编辑/删除已提交的想法。而且我也不需要它们能够编辑其他批次信息,只需添加相关的想法。
我知道可能有一种简单的方法可以达到这个目的,但我现在有点卡住了。
任何帮助都将不胜感激。
谢谢!
编辑:我不是指Django管理员。这适用于面向用户的表单。答案 0 :(得分:0)
外键/ M2M字段旁边应该有一个可点击的绿色+
标记。这样您就可以创建新的Idea
,然后返回Lot
实例。
以下是一个示例(filter_horizontal
使用ManyToManyField
):
答案 1 :(得分:0)
这是我发现的解决方案:(参考:https://docs.djangoproject.com/en/1.5/topics/class-based-views/mixins/#using-formmixin-with-detailview)
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)