2016-04-09 10 views
0

In meiner Datenbank habe ich einige meiner Fehler gespeichert, so dass ich sie problemlos zwischen Ansichten senden kann. Hier ist eine meine models.py:Objekte in Wörterbuch in Django speichern

class Errors(models.Model): 
    error_number = models.IntegerField(primary_key=True) 
    error_message = models.CharField(max_length=45) 
    status = models.BooleanField(default=0) 
    datetime = models.DateTimeField(auto_now=True) 

Ich möchte Fehler in ein Wörterbuch legen, damit ich es nach Vorlage weitergeben kann. Ich möchte, dass dies nur passiert, wenn der Status True/1 ist. Ist die Ansicht korrekt?

Wie es jetzt ist, denke ich, dass es ein schlechtes Programm ist, da ich newtwork beim Aufrufen von Errors.objects.all() überflute, aber ich weiß nicht anders, wie man die for-Schleife implementiert.

def index(request): 
    err = {'error_numbers':[], 'error_messages': [], 'datetime':[], 'test':[]} 

    warnings = Errors.objects.all() 

    for warning in warnings: 
     if Errors.objects.filter(status='1'): 
      err['error_numbers'].append(warning.error_number) 
      err['error_messages'].append(warning.error_message) 
      err['datetime'].append(warning.datetime) 

    return render(request, "index.html", err) 

Darf ich fragen auch, wie könnte ich Gruppe alle Daten von gleichen Fehler heißt Fehlernummer, Fehlermeldung und Datumzeit in Vorlage zusammen angezeigt werden? (P. S. Ich weiß, dass die Frage nach Code in SO ist ein No-No ist also nur optional für jeden, der bereit ist, einige nützliche Website oder Beispiel zu teilen).

Beispiel (wie ich am moemnt verwende) bellow druckt gar nichts.

<ul> 
{% for key, value in err.iteritems %} 
    <li>{{key}: {{value}}</li> 
{% endfor %} 
</ul> 

Antwort

1

Es gibt eine Menge zu sagen über den Code, den Sie geteilt haben.

Zunächst einmal bin ich nicht wirklich sicher, warum Sie wirklich ein Wörterbuch mit dieser Struktur brauchen. Was ist Ihre gewünschte Ausgabe?


Zweitens dieser Code Stück ist fischig:

for warning in warnings: 
    if Errors.objects.filter(status='1'): 
     .... 

status ein BooleanField ist. Sie sollten es mit einem booleschen Wert filtern. Auf der anderen Seite, warum müssen Sie die gesamte Datenbank in einer Iteration herausfiltern? Meinst du sowas?

for warning in warnings: 
    if warning.status: 
     ... 

Eine andere Sache ist die Namensgebung Sie gewählt haben. Es ist eine bessere Übung, Ihren Modellen einzigartige Namen zu geben. Verwenden Sie Error anstelle von Errors.


Wenn Sie wirklich so etwas tun müssen. Ich schlage vor, Sie verwenden collections.defaultdict. Es ermöglicht das dynamische Hinzufügen von Schlüsseln mit list.

Aber wieder scheint es, als ob Sie versuchen, etwas Hacky zu erreichen. Sie sollten wahrscheinlich Ihre Bedürfnisse und Herangehensweise überdenken.


Nach all dem sollte ein Schlüssel und eine Liste für jede Taste ausdrucken.

<ul> 
{% for key, values in err.iteritems %} 
<li>{{key}}: #edited here, 1 "}" was missing 
    {% for value in values %}{{value}}{% endfor %} 
</li> 
{% endfor %} 
</ul> 
+0

Viele Dinge, die Sie genannt haben, haben mich über meinen Code nachdenken lassen. Ich habe das meiste behoben, aber es werden immer noch keine Daten an die Site gesendet. Ich habe die Quelle überprüft und es war leer, wo diese Daten sein sollten. Sonst in diesem Fall habe ich BooleanField verwendet, so wie Sie mich korrigiert haben, konnte ich "warning.status" verwenden, aber was, wenn Charfield verwendet würde und ich würde basierend darauf iterieren? Zum Beispiel: if (warning.error_message__startswith = 'Device') .. wäre das eine gute if-Anweisung? – narn

+1

'wenn Warnung.error_message.startswith ('Device'): 'würde funktionieren. Oder Sie können sie an erster Stelle herausfiltern: 'Error.objects.filter (error_message__startswith = 'Device')'. Oder in Ihrem Fall: 'Error.objects.filter (status = True)'. Verwenden Sie stattdessen "err.items". Dies ist die Django-Vorlagensyntax, nicht Python. – username

+0

Ok danke, werde meinen Code entsprechend anpassen. Leider hat 'err.items' das Problem nicht behoben. Irgendwelche Vorschläge wie könnte ich das debuggen? (Es gibt genau 1 Reihe in der Datenbank, die diese Bedingung ATM erfüllt, also bin ich sicher, dass etwas ausgegeben werden sollte). – narn

Verwandte Themen