我认为我需要做的是与inlineformset完全相反。
说我有:
from django.db import models
class Type(models.Model):
description = models.CharField(max_length=50)
status = models.ForeignKey(Status)
def __unicode__(self):
return self.description
class ColorType(models.Model):
type = models.ForeignKey(Type)
color = models.ForeignKey('Color')
status = models.ForeignKey(Status)
def __unicode__(self):
return u'%s %s' % (self.type, self.color)
class Color(models.Model):
description = models.CharField(max_length=50)
status = models.ForeignKey(Status)
types = models.ManyToManyField(type, through=ColorType)
def __unicode__(self):
return self.description
class Chair(models.Model):
description = models.CharField(max_length=50)
status = models.ForeignKey(Status)
colorType = models.ForeignKey(ColorType)
现在我需要一个表单来编辑一个椅子,我在其中分别输入Color和Type(就像显示ColorType的modelformset一样)。如果组合不存在,则应用程序必须创建必要的ColorType实例(并将其指定为desfault状态)并将其分配给主席。
我认为整个情况很常见,我应该遗漏一些东西......
答案 0 :(得分:1)
我做了我的搜索,遗憾的是,目前不能只使用Django为每个表单设置多个模型。话虽如此,你并不是唯一想要这样做的人。
save
方法以应用您的用例(ColorType组合等)答案 1 :(得分:1)
我会发布自己的解决方案。最后,我只是使用InlineFormsets来完成这个技巧。
在forms.py中:
class ChairForm(forms.ModelForm):
class Meta:
model = Chair
exclude = ('colorType')
class ColorTypeForm(forms.ModelForm):
class Meta:
model = ColorType
exclude = ('status')
在views.py中:
def ChairUpdate(request, chair_id):
chair = get_object_or_404(Chair, pk=chair_id)
form = ChairForm(instance=chair)
ColorTypeInlineFormset = inlineformset_factory(ColorType, Chair, formset=ColorTypeForm)
if request.method == 'POST':
form = ChairForm(request.POST, instance=chair)
if form.is_valid():
chair = form.save(commit=False)
colorTypeInlineFormset = ColorTypeInlineFormset(request.POST,)
# colorTypeInlineFormset.is_valid()
color = Color.objects.get(id=request.POST['color'])
type = Type.objects.get(id=request.POST['type'])
ct,created = ColorType.objects.get_or_create(color=color,type=type,defaults={'status':Status.objects.get(id=1)})
chair.colorType = ct
# marcaModeloInlineFormset.save(commit=False)
arma.save()
return HttpResponseRedirect(reverse('success_page'))
colorTypeInlineFormset = ColorTypeInlineFormset(instance=chair.colorType)
return render(request, "chair_form.html", {
'chair': chair,
'form': form,
'colorType_formset': colorTypeInlineFormset,
'action': "Update"
})