2015-10-05 17 views
6

Mam dwa modele i oba mają pole "status", które ma dla nich inne znaczenie.django dwa ModelForms z tą samą nazwą pola na jednym szablonie

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) 
    ... 

Ich formy wygląda następująco:

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',) 

chcę zmieniać zarówno w polach na tej samej stronie. Moja view.py wygląda

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)) 

I szablonu:

<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> 

Ale w wyniku form.status pobiera wartości z form_edit.status co nie jest poprawne. Muszę rozwiązać ten problem bez zmiany nazw pól modelu, ale nie wiem jak.

Odpowiedz

6

Użyj argumentu prefix dla twoich formularzy, do przestrzeni nazw nazw pól.

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

Pamiętaj, aby użyć tego samego prefiksu podczas tworzenia formularza z danymi POST.

+0

dziękuję bardzo, że działa –

Powiązane problemy