2016-09-08 4 views
0

Ich habe diese Frage viel Zeit hier gefragt, aber ich kann nicht herausfinden, warum es in meinem Fall nicht funktioniert. Ich habe den folgenden Code anzeigen:Django-Formular erstellt neue Instanz anstatt eine vorhandene zu aktualisieren

def edit(request, coffee_id=None): 
coffee = get_object_or_404(Drink, pk=coffee_id) if coffee_id else Drink() 
if request.method == 'POST': 
    form = CoffeeForm(request.POST, instance=coffee) 
    if form.is_valid(): 
     form.save() 
     return HttpResponseRedirect(urlresolvers.reverse('coffee:index')) 
else: 
    form = CoffeeForm(instance=coffee) 

return render(request, 'edit.html', {'coffee_form': form}) 

Dies soll eine neue Instanz von Kaffee erstellen oder einen neuen zu aktualisieren, wenn in Argumente coffee_id in der Datenbank vorhanden ist.

Aber auch wenn coffee_id in der Datenbank existiert, wird immer eine neue Instanz von Kaffee erstellt.

Ich habe auch versucht, die Kaffee-Instanz zu speichern, ohne das Formular zu speichern, aber es tut das gleiche.

Gibt es etwas, das ich falsch mache? Soll ich etwas Besonderes im Modell einstellen, um ein Update zu ermöglichen?

bearbeiten

Dies ist das Getränk Form

class CoffeeForm(forms.ModelForm): 
class Meta: 
    model = Drink 
    fields = ('time', 'location', 'type') 

def __init__(self, *args, **kwargs): 
    super(forms.ModelForm, self).__init__(*args, **kwargs) 

    coffee_category = Category.objects.get(name='coffee') 
    coffee_drink_types = DrinkType.objects.filter(category=coffee_category.id) 
    self.fields['type'].choices = ((x.id, str(x)) for x in coffee_drink_types) 

Und das Getränk Modell:

class Drink(models.Model): 
    time = models.DateTimeField('time', default=datetime.datetime.now) 
    location = models.ForeignKey(Location) 
    type = models.ForeignKey(DrinkType) 

** ** Bearbeiten

die Urls hinzufügen:

urlpatterns = [ 
    url(r'^$', views.index, name='index'), 
    url(r'^edit/$', views.edit, name='edit'), 
    url(r'^edit/(?P<coffee_id>[0-9]*)/$', views.edit, name='edit') 
] 
+0

Können Sie das CoffeeForm- und das Drink-Modell selbst zeigen? –

+0

Ich habe den Beitrag bearbeitet. Thx – Bertrand

+0

Sind Sie sicher, dass 'coffee_id' an die Ansicht übergeben wird? Kannst du deine URLs zeigen? – Alasdair

Antwort

0

get_object_or_404 Fehler, wenn das Getränk mit der angegebenen ID nicht existiert.

Sind Sie sicher, dass POSTING gegen/edit/1 ausgeführt wird? Wenn die Formularaktion nicht über die ID verfügt, wird ein neues Getränk erstellt.

Ich würde empfehlen, Sie gehen mit separaten erstellen und bearbeiten Ansichten. Möglicherweise Klasse basierte Ansichten verwenden, aber wenn Sie haben Gründe, sie nicht zu verwenden, so etwas wie dies funktionieren könnte:

def create_coffee(request): 
    if request.method == 'POST': 
     form = CoffeeForm(request.POST) 
     if form.is_valid(): 
      coffee = form.save() 
      return redirect(reverse('edit_coffee', kwargs={'coffee_id': coffee.pk})) 
    else: 
     form = CoffeeForm() 

    return render(request, 'create.html', {'coffee_form': form}) 


def edit_coffee(request, coffee_id=None): 
    coffee = Drink.objects.filter(pk=coffee_id).first() 
    if not coffee: 
     return redirect(reverse('create_coffee')) 
    else: 
     if request.method == 'POST': 
      form = CoffeeForm(request.POST, instance=coffee) 
      if form.is_valid(): 
       form.save() 
     else: 
      form = CoffeeForm(instance=coffee) 

     return render(request, 'edit.html', {'coffee_form': form}) 
+0

Thx für Ihre Antwort. Ich dachte, es wäre möglich, eine einzige Ansicht zum Bearbeiten und Erstellen von Objekten mit Django zu haben, aber vielleicht ist es kein gutes Muster ... Außerdem sehe ich den Code in der 'edit_coffee'-Methode nicht, der das Erstellungsupdate beheben könnte. – Bertrand

+0

Sehen Sie, wenn Sie gegen/edit/123 POST sind? Sie können es wahrscheinlich mit ein paar Druckanweisungen herausfinden. –

1

Sie CoffeeForm verwenden sollten, nicht ModelForm wenn super aufrufen.

class CoffeeForm(forms.ModelForm): 
    class Meta: 
     model = Drink 
     fields = ('time', 'location', 'type') 

    def __init__(self, *args, **kwargs): 
     super(CoffeeForm, self).__init__(*args, **kwargs) 
+0

Sie haben Recht für Ihre Bemerkung. Allerdings habe ich noch neue Einträge erstellt :) – Bertrand

0

Ich weiß nicht, ob Sie immer noch dieses Problem überprüfen, ich fand dies auf der Suche nach dem gleichen Problem, und ich habe es geschafft, dies zu lösen. In meinem Fall war das Problem, dass ich die gleiche Vorlage für die neuen und bestehenden Objekte verwendet, und das Formular ging zurück und neue Instanzen erstellen, löste ich das Erstellen mehrerer Ansichten in diesem Moment mit mehreren Vorlagen.

Der Punkt, wo ich auf der Strecke war, war, als ich meine action="/add" aus meinem Formular entfernte und ich sah, dass nichts passiert :). Ich sehe, dass Sie die gleichen Vorlagen verwenden und nicht von der Ansicht aus ändern, so dass Sie dies möglicherweise auch tun müssen. Wenn Sie diesen Beitrag nicht lösen können, sind Ihre Vorlage (n) und ich bin glücklich zu helfen, weil es mir helfen kann, Django zu lernen! :)

Verwandte Themen