Django在一个表单中编辑一个Model对象和一个引用的对象

时间:2014-02-14 16:02:34

标签: django forms model foreign-keys django-forms

我认为我需要做的是与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状态)并将其分配给主席。

我认为整个情况很常见,我应该遗漏一些东西......

2 个答案:

答案 0 :(得分:1)

我做了我的搜索,遗憾的是,目前不能只使用Django为每个表单设置多个模型。话虽如此,你并不是唯一想要这样做的人。

  • 有一个SO答案here可以提出好的建议。
  • 如果你仍然想要它,你可以使用something like this自己动手,但有点不同,因为这个版本接受一种形式或另一种形式,而不是同时接受这两种形式。
  • 如果您不想自己编写代码,django-multiform是一个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"
    })