2015-10-05 139 views
6

我有兩個模型,並且都有字段「狀態」,它們對它們有不同的含義。django在同一個模板上使用相同字段名稱的兩個ModelForms

class Order(models.Model): 
    ... 
    status = models.PositiveIntegerField(default=0, choices=ORDER_STATUSES) 
    ... 

class ACS(models.Model): 
    status = models.IntegerField(default=-1, choices=STATUSES) 
    order = models.ForeignKey(Order, blank=True, null=True) 
    ... 

它們的形式是這樣的:

class ACSForm(forms.ModelForm): 
    status = forms.ChoiceField(
     choices=STATUSES, 
     widget=forms.Select(attrs={'class': 'form-control'}) 
    ) 
    ... 

    class Meta: 
     model = ACS 
     fields = ('status',) 

class OrderACSEditForm(forms.ModelForm): 
    status = forms.ChoiceField(
     choices=ORDER_STATUSES, 
     widget=forms.Select(attrs={'class': 'form-control'}) 
    ) 

    class Meta: 
     model = Order 
     fields = ('status',) 

我想同時編輯同一個頁面上此領域。我view.py看起來像

def edit(request, item_id=""): 
    data = ACS.objects.get(pk=item_id) 
    form = ACSForm(instance=data) 
    order = Order.objects.get(id=data.order.id) 
    form_edit = OrderACSEditForm(instance=order) 
    if request.POST: 
     form = ACSForm(request.POST, instance=data) 
     form_edit = OrderACSEditForm(request.POST) 
     if form.is_valid() and form_edit.is_valid(): 
      form_edit.save() 
      obj = form.save() 
      messages.add_message(request, messages.SUCCESS, 'Your data successfully saved.') 

     if request.POST['action'] == "save_stay": 
      return redirect("/panel/packages/acs/edit/" + str(obj.id)) 
     else: 
      return redirect("/panel/packages/acs/") 
    return render(request, 'ui/packages/acs/edit.html', dict(data=data, form=form, form_edit=form_edit, item_id=item_id)) 

而且模板

<div class="form-group {% if form.status.errors %}has-error{% endif %}"> 
    <label>{% trans "Status" %}</label> 
     {% if form.status.errors %} 
      {% for error in form.status.errors %} 
       <label class="control-label">{{ error }}</label> 
      {% endfor %} 
     {% endif %} 
     {{ form.status }} 
</div> 

<div class="form-group {% if form_edit.status.errors %}has-error{% endif %}"> 
    <label>{% trans "Order status" %}</label> 
     {% if form_edit.status.errors %} 
      {% for error in form_edit.status.errors %} 
       <label class="control-label">{{ error }}</label> 
      {% endfor %} 
     {% endif %} 
     {{ form_edit.status }} 
</div> 

但結果form.status從form_edit.status這是不正確的得到的值。我需要解決這個問題,而不更改模型字段的名稱,但不知道如何。

回答

6

使用表格的prefix參數來命名空間字段名稱。

form = ACSForm(prefix='acs', instance=data) 
form_edit = OrderACSEditForm(prefix='edit', instance=order) 

記住在使用POST數據實例化表單時也要使用相同的前綴。

+0

非常感謝,那工作 –

相關問題