2017-05-03 2 views
2

Ich arbeite an einer kleinen Django App und bekomme einen Fehler sagt mir, super(type, obj): obj must be an instance or subtype of type. Ich bekomme es von der Datei views.py nach der Einführung der Funktion get_object_or_404. Die views.py Datei unten angegeben,Super (Typ, Obj): Obj muss eine Instanz oder Subtyp des Typs sein

from django.shortcuts import render, get_object_or_404  
from django.http import HttpResponse, HttpResponseRedirect  
from django.views import View  
from .models import URL 


# function based view 
def redirect_view(request, shortcode=None, *args, **kwargs): 
    obj = get_object_or_404(URL, shortcode=shortcode) 
    return HttpResponse("Hello World, the shortcode is {shortcode}".format(shortcode = obj.url)) 


# class based view 
class ShortenerView(View): 

    def get(self, request, shortcode=None, *args, **kwargs): 
     obj = get_object_or_404(URL, shortcode=shortcode) 
     return HttpResponse("Hello World 1, the shortcode is {shortcode}".format(shortcode = obj.url)) 

    def post(self, request, *args, **kwargs): 
     return HttpResponse() 

die vollständige Fehlermeldung hier ist,

TypeError at /b/p6jzbp/ 
super(type, obj): obj must be an instance or subtype of type 
Request Method: GET 
Request URL: http://127.0.0.1:8000/b/p6jzbp/ 
Django Version: 1.11 
Exception Type: TypeError 
Exception Value:  
super(type, obj): obj must be an instance or subtype of type 
Exception Location: /Users/Chaklader/Documents/Projects/UrlShortener/src/shortener/models.py in all, line 18 

Die line 18 im models.py ist qs_main = super(URL, self).all(*args, **kwargs) und die models.py Datei hier ist,

# will look for the "SHORTCODE_MAX" in the settings and 
# if not found, will put the value of 15 there 
SHORTCODE_MAX = getattr(settings, "SHORTCODE_MAX", 15) 



class UrlManager(models.Manager): 

    def all(self, *args, **kwargs): 
     qs_main = super(URL, self).all(*args, **kwargs) 
     qs  = qs_main.filter(active = True) 
     return qs 

    def refresh_shortcodes(self, items = None): 

     qs = URL.objects.filter(id__gte=1) 
     new_codes = 0 

     if items is not None and isinstance(items, int): 
      qs = qs.order_by('-id')[:items] 

     for q in qs: 
      q.shortcode = create_shortcode(q) 
      print (q.id, " ", q.shortcode) 
      q.save() 
      new_codes += 1 

     return "# new codes created {id}".format(id = new_codes) 


class URL(models.Model): 

    url   = models.CharField(max_length = 220,) 
    shortcode = models.CharField(max_length = SHORTCODE_MAX, blank = True, unique = True) 
    updated  = models.DateTimeField(auto_now = True) 
    timestamp = models.DateTimeField(auto_now_add = True) 
    active  = models.BooleanField(default = True) 

    objects = UrlManager() 

    def save(self, *args, **kwargs): 

     if self.shortcode is None or self.shortcode == "": 
      self.shortcode = create_shortcode(self) 

     super(URL, self).save(*args, **kwargs) 

    def __str__(self): 
     return str(self.url) 

    def __unicode__(self): 
     return str(self.url) 

    # class Meta: 
    # ordering = '-id' 

Kann jemand erkläre mir den Grund des Irrtums und wie kann ich es lösen? Ich bin offen, um mehr Informationen zur Verfügung zu stellen, wenn erforderlich.

Antwort

4

Sie sollten super unter Verwendung der UrlManager Klasse als erstes Argument nicht das URL Modell anrufen. super kann nicht mit einer sein unabhängige Klasse/Typ genannt:

Aus den Dokumenten,

super(type[, object-or-type]): ein Proxy-Objekt zurück, dass die Delegierten Methode zu einem Elternteil oder Geschwister Klasse des Typs aufruft.

So können Sie nicht tun:

>>> class D: 
... pass 
... 
>>> class C: 
... def __init__(self): 
...  super(D, self).__init__() 
... 
>>> C() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in __init__ 
TypeError: super(type, obj): obj must be an instance or subtype of type 

Sie tun sollten:

qs_main = super(UrlManager, self).all(*args, **kwargs) 

Oder in Python 3:

qs_main = super().all(*args, **kwargs) 
+0

Ich bekomme immer noch den gleichen Fehler. – Arefe

+0

Ist der Traceback immer noch derselbe? Der Fehler, den Sie angezeigt haben, ist der "all" -Methode des Managers, den ich in meiner Antwort angesprochen habe. –

+0

es gelöst. Danke vielmals. – Arefe

1

Eine weitere interessante Art und Weise ist, wenn eine Zusammenführung der Filialen hat die Klasse dupliziert, so dass in der Datei Sie zwei Definitionen für die Sam haben der Name z.B.

class A(Foo): 
    def __init__(self): 
     super(A, self).__init__() 
     #... 

class A(Foo): 
    def __init__(self): 
     super(A, self).__init__() 
     #... 

Wenn Sie versuchen, eine Instanz von einem statischen Bezug auf die erste Definition von A zu erstellen, wenn es versucht, super zu nennen, in der __init__ Methode wird A auf die zweite Definition von A beziehen, da es wurde überschrieben. Die Lösung - natürlich - ist, die doppelte Definition der Klasse zu entfernen, damit sie nicht überschrieben wird.

Das mag wie etwas erscheinen, das nie passieren würde, aber es passierte mir einfach, als ich der Verschmelzung zweier Zweige nicht genügend Aufmerksamkeit schenkte. Meine Tests scheiterten mit der in der Frage beschriebenen Fehlermeldung, daher dachte ich, ich würde meine Ergebnisse hier belassen, obwohl sie die spezifische Frage nicht genau beantwortet.

Verwandte Themen