2014-02-14 63 views
2

我認爲我需要做的實際上與inlineformset相反。Django以一種形式編輯模型對象和引用對象

說我有:

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) 

現在我需要一個表單編輯我在其中輸入彩色椅子和separatedly類型(如顯示的的ColorType一個modelformset)。如果組合不存在,應用程序必須創建必要的ColorType實例(併爲其分配默認狀態)並將其分配給椅子。

我覺得整個情況是常見的,應該是我失去了一些東西......

回答

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" 
    }) 
1

我做搜索和可悲的是,它目前無法讓每個使用僅Django的形式不止一種模式。這就是說,你不是唯一一個想這樣做的人。

  • 有一個SO回答here它提出了很好的建議。
  • 如果你仍然想要它,你可以使用something like this來滾動你自己,但有點不同,因爲這個版本接受一種形式或另一種形式,而不是一次。
  • 如果你不想自己編寫代碼,django-multiform是一個Django庫,它提供了一種通用的方法來做你想做的事。當然,您需要更改save方法來申請您的用例(ColorType組合等)