2016-06-02 13 views
1

Ich erstelle einen Klon von fiverr.com als ein Projekt.KeyError in Django

Es gibt eine Kopfzeile in meiner base.html mit Kategorietiteln, die, wenn ich klicke, nur die Gigs in der entsprechenden Kategorie zur Anzeige herausfiltern soll.

Was passiert ist, dass es immer nach Hause umgeleitet wird. Ich habe einige Tests gemacht und glaube, dass es wegen der KeyError sein sollte, und keine Verbindung wird an die Funktion korrekt übergeben.

-Code unten:

views.py

def category(request, link): 

    categories = { 
     "Graphics & Design": "GD", 
     "Digital & Marketing": "DM", 
     "Video & Animation": "VA", 
     "Music & Audio": "MA", 
     "Programming & Tech": "PT" 
    } 
    try: 
     gigs = Gig.objects.filter(category=categories[link]) 
     return render(request, 'home.html', {"gigs": gigs}) 
    except KeyError: 
     return redirect('home') 

models.py

class Gig(models.Model): 
    CATEGORY_CHOICES = (
     ("GD", "Graphics & Design"), 
     ("DM", "Digital & Marketing"), 
     ("VA", "Video & Animation"), 
     ("MA", "Music & Audio"), 
     ("PT", "Programming & Tech") 
) 
    title = models.CharField(max_length=500) 
    category = models.CharField(max_length = 2, choices=CATEGORY_CHOICES) 
    description = models.CharField(max_length=1000) 
    price = models.IntegerField(default=6) 
    photo = models.FileField(upload_to='gigs') 
    status = models.BooleanField(default=True) 
    user = models.ForeignKey(User) 
    create_time = models.DateTimeField(default=timezone.now) 

    def get_absolute_url(self): 
     return reverse('my_gigs') 

    def __str__(self): 
     return self.title 

base.html (wo die Links sind - versucht, einen anderen Weg, den gleichen Link für Graphicsbekommen 210 Design, aber Ergebnisse waren ähnlich)

<nav class="navbar navbar-light bg-faded"> 
    <div class="container"> 
     <ul class="nav navbar-nav"> 
     <li class="nav-item active"> 
      <a class="nav-link" href='category/graphics-design'>Graphics &  Design <span class="sr-only">(current)</span></a> 
     </li> 
     <li class="nav-item"> 
      <a class="nav-link" href="{% url 'category' 'digital-marketing' %}">Digital Marketing</a> 
     </li> 
     <li class="nav-item"> 
      <a class="nav-link" href="{% url 'category' 'video-animation' %}">Video & Animation</a> 
     </li> 
     <li class="nav-item"> 
      <a class="nav-link" href="{% url 'category' 'music-audio' %}">Music & Audio</a> 
     </li> 
     <li class="nav-item"> 
      <a class="nav-link" href="{% url 'category' 'programming-tech' %}">Programming & Tech</a> 
     </li> 
     </ul> 
    </div> 
    </nav> 

urls.py

url(r'^category/(?P<link>[\w|-]+)/$', views.category, name='category'), 
+0

Könnten Sie in Ihrem Skript drucken (Link) und überprüfen, ob Sie den Linkwert aus der Anfrage erhalten? – Kannaj

+0

Hallo Kunkka, danke für deine Antwort. Ich habe sowohl {% print (link)%} als auch {{link}} in der .html Datei gemacht, aber es konnte nicht funktionieren. Nicht sicher, ob ich es sogar richtig drucke. Ich bin immer noch ziemlich neu für Python und Django im Allgemeinen, also finde ich es meistens alleine heraus, während ich Beispiele mache. Stack Overflow war jedoch sehr hilfreich. Ich danke dir sehr! –

Antwort

3

Die Ansicht wird die Aufnahme eines Wert slug in link Parameter. Also, sollten Sie das categories Wörterbuch neu zu definieren:

def category(request, link): 

    categories = { 
    "graphics-design": "GD", 
    "digital-marketing": "DM", 
    "video-animation": "VA", 
    "music-audio": "MA", 
    "programming-tech": "PT" 
    } 
    ... 
+1

Hallo Cartucho, danke für die Lösung, es hat funktioniert. Hätte es mir beigebracht, das zu versuchen ... immer noch zu lernen, während ich gehe. Danke vielmals! –

+0

@JimTay Keine Sorge! Schön zu wissen, dass es dir hilft. – Cartucho

1

Was ist die URL, die Sie eingeben werden? Es muss sein, weil der Parameter 'link' keinen Schlüssel aus dem Wörterbuch 'categories' gefunden hat.

So etwas wie dies (versuchen Sie es auf Ihrer Python-Kommandozeile):

>>> x = {'name': 'dean'} 
>>> x['xx'] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'xx' 
>>> 

Durch die Art und Weise eine Beratung für Sie, wenn Sie zu fangen versuchen. Verwenden Sie diese Syntax, um den Fehler zu sehen

+1

Hallo Dean vielen Dank für Ihren Vorschlag. Die obige Antwort hat mein Problem gelöst. Ich werde jedoch versuchen, Fehler zu finden. Ich bin noch neu in Python & Django und lerne jeden Tag. Vielen Dank! –

+0

Hallo @JimTay Ich bin froh, dass ich helfen konnte –