2017-10-23 4 views
1

Ich reiche eine POST-Anfrage über Django-Formular an meine Django Rest Framework API.Redirect nach POST django Rest Framework

Hier ist ein Ausschnitt aus meiner Form:

<form action="{% url 'entry-list' %}" method="POST" class="form" role="form"> 
{% csrf_token %} 

{{form.as_p}} 
<div class = "form-group"> 
    <button type="submit" class="save btn btn-default btn-block">Save</button> 
</div> 

views.py:

class entry_ViewSet(viewsets.ModelViewSet): 
    queryset = Entry.objects.all() 
    serializer_class= EntrySerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly,) 
    def perform_create(self, serializer): 
     serializer.partial = True 
     serializer.save(created_by=self.request.user) 

Ich bin eine erfolgreiche POST machen (und Element wird in der Datenbank erstellt wurde), aber Sobald ich gespeichert habe, gehe ich zur URL /api/entry/, die meine api w/Markdown zeigt. Ich möchte, dass es auf eine bestimmte URL zurückgeht.

Gibt es eine Möglichkeit, anzupassen, wo die POST umleiten, wenn erfolgreich?

Added Serializer:

class EntrySerializer(serializers.ModelSerializer): 

    created_by = serializers.ReadOnlyField(source='created_by.username') 
    class Meta: 
     model = Entry 
     fields = '__all__' 
    def __init__(self, *args, **kwargs): 
     super(EntrySerializer, self).__init__(*args, **kwargs)   
     for x in self.fields: 
      self.fields[x].required = False  
+0

Können Sie Ihren 'EntrySerializer' teilen? –

+0

edited zum Hinzufügen von Serializer – TangoAlee

Antwort

3

viewsets.ModelViewSet hat eine Methode create die Response Objekt zurückgibt. Das Antwortobjekt ist der Subtyp Django Response. Daher können Sie das Verhalten unter Verwendung von HttpResponseRedirect in die create-Methode ändern. Zum Beispiel:

class entry_ViewSet(viewsets.ModelViewSet): 
    queryset = Entry.objects.all() 
    serializer_class= EntrySerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,IsOwnerOrReadOnly,) 

    def create(self, request, *args, **kwargs): 
     response = super(entry_ViewSet, self).create(request, *args, **kwargs) 
     # here may be placed additional operations for 
     # extracting id of the object and using reverse() 
     return HttpResponseRedirect(redirect_to='https://google.com') 

    def perform_create(self, serializer): 
     serializer.partial = True 
     serializer.save(created_by=self.request.user) 
+1

Ich dachte nie über das Überschreiben erstellen, aber das Super zuerst aufrufen. Sehr toll - vielen Dank !! – TangoAlee

Verwandte Themen