6

Ich habe zwei Modelle und beide haben Feld "Status", die für sie unterschiedliche Bedeutung hat.django zwei ModelForms mit gleichen Feldnamen auf einer Vorlage

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

Ihre Formen wie folgt aussieht:

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

ich beide diese Felder auf der gleichen Seite bearbeiten möchten. Mein view.py sieht aus wie

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

Und Vorlage:

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

Aber in Folge form.status bekommt Werte von form_edit.status, die nicht korrekt ist. Ich muss dieses Problem lösen, ohne die Namen der Modellfelder zu ändern, weiß aber nicht wie.

Antwort

6

Verwenden Sie das Argument prefix für Ihre Formulare, um die Feldnamen zu benennen.

Denken Sie daran, dasselbe Präfix zu verwenden, wenn Sie das Formular auch mit POST-Daten instanziieren.

+0

vielen Dank, das funktioniert –

Verwandte Themen