Wordpress Auto ändern

Django Restangular / AngularJS, MongoDB, Django, REST

In Allgemein by oesahLeave a Comment

Derzeit arbeite ich an einem Projekt mit Django Restangular. Der Backlink Generator soll ausgebaut werden. Ich als Django Webprogrammierer wollte dabei das Beste rausholen und das mit Django. Nun habe ich den „perfekten“ Stack für mich gefunden und arbeite daran, die Seite neu aufzusetzen mit neuen Features.

Auf meiner Reise stoße ich immer wieder auf Hindernisse, die daraus resultieren, dass der Stack relativ neu ist (zumindest die Komponenten darin). Deshalb möchte ich meine Erfahrungen einmal preisgeben, damit andere schneller voran kommen.

Der Stack den ich nutze für Django Restangular:

Restangular AngularJS Beispiel

Restangular.all('links').getList().then(function (links) {
    $scope.allLinks = links;
    $scope.newLink = function(){
        $scope.selectedLink = $scope.selectedLinkTemplate;
    };
    $scope.deleteLink = function(pk, idx) {
        var linkWithId = _.find($scope.allLinks, function(link) {
            return link.id === pk;                
        });
        
        linkWithId.remove().then(function (){
            console.log('success!');
            $scope.allLinks.splice(idx, 1)            
        });
    };
    $scope.saveLink = function() {
        $scope.allLinks.post($scope.selectedLink);
        console.log("Saved");
    };
}, function errorCallback() {
  console.log("Oops, there seems to an error from the server.");
});

Django Restangular Serializers Probleme

Wenn man die Standard Serializer von REST Api mit der MongoDB nutzt, bekommt man ein paar Fehler:

invalid literal for int() with base 10: '...'

Oder man bekommt die Meldung, dass die ID benötigt wird wenn man ein Object durch den Serializer speichern möchte.

Um das Problem zu bereinigen, kann man folgendes tun:

class MyModelSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.CharField(max_length=144, required=False)
    
    class Meta:
        model = MyModel
        fields = ('id', 'var1', 'var2')

Und schon kann man die Rest API mit MongoDB IDs nutzen.

Wenn man Objekte abspeichert, sollte die ID leer sein. So erstellt Django eine automatisch.

Routers für Django Restangular

Ein weitere Problem entsteht, wenn man Restangular nutzt in Kombination mit AngularJS. Hier muss man darauf achten, folgende Einstellung bei jedem Router macht:

router = routers.DefaultRouter(trailing_slash=False)

So meidet man den 501 Fehlercode:

RuntimeError at ...
You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. 
Django can't redirect to the slash URL while maintaining POST data. Change your form to point 
to ... (note the trailing slash), or set APPEND_SLASH=False in your Django settings.

Wenn man die Einstellung in settings.py ändert, wirkt sich das auf vorhandene Verlinkungen aus. Das heisst, man müsste vieles anpassen. Mit dem Router Trick lässt sich das individuell einstellen und somit Django Restangular zum laufen kriegen.

Leave a Comment