2017-07-17 3 views
0

Neu auf Python und es ist schwer, Fehlercodes zu lösen.'NoneType' -Objekt hat kein Attribut 'to_bytes'

Ich habe ein Formular, das Zeilen zu einer Postgresql-Datenbank hinzufügt. Das Formular hat ein Autofeld, das der Primärschlüssel in meinem models.py ist. Hinzufügen von Zeilen als solche Werke und die uniqueid Felder zählt nach oben wie des bestimmungsgemäßen (1,2,3, ...)

models.py:

class forwards(models.Model): 
    uniqueid = models.AutoField(primary_key=True) 
    user = models.CharField(max_length = 150) 
    urlA = models.CharField(max_length = 254) 
    counterA = models.DecimalField(max_digits=19, decimal_places=0,default=Decimal('0')) 
    urlB = models.CharField(max_length = 254) 
    counterB = models.DecimalField(max_digits=19, decimal_places=0,default=Decimal('0')) 
    timestamp = models.DateTimeField('date created', auto_now_add=True) 
    shortcodeurl = models.CharField(max_length = 254) 

forms.py:

class AddUrlForm(forms.ModelForm): 

    class Meta: 
     model = forwards 
     # fields = '__all__' 
     exclude = ["user", "counterA", "counterB", "shortcodeurl", "uniqueid"] 

Ziel ist es, den Primärschlüsselwert (der eine Ganzzahl gemäß here sein sollte) zu verwenden, ihn in "Bytes" umzuwandeln und dann eine Byte-zu-Base64-Konvertierung durchzuführen, um eine Shortcode-URL zu erstellen. Ich möchte diesen Shortcode in der Tabelle speichern. Ich versuche, dies in der views.py zu tun

views.py

def forwardthis(request): 
    forwardform = AddUrlForm(request.POST or None) 
    if forwardform.is_valid(): 
     forward = forwardform.save(commit=False) 
     forward.user = request.user.username 
     uniqueid_local = forward.uniqueid 
     print(uniqueid_local) 
     uniqueid_local_bytes = uniqueid_local.to_bytes(3, byteorder='big') 
     shortcodeurl_local = urlsafe_base64_encode(uniqueid_local_bytes) 
     forward.shortcodeurl = shortcodeurl_local 
     forward.save() 

Mein Problem:

ich nicht gelingt, diese Short URL bei der Erstellung und bin immer ein "NoneType" Error. Ich habe versucht, models.py in BigIntegerField und IntegerField zu ändern, aber das hat nicht funktioniert. Hinzufügen " default=0 " zu uniqueid = models.AutoField(primary_key=True) erzeugt kein Fehler das erste Mal, dass ich ein Formular eingereicht, aber dann, wenn eine zweite Form vorlegt, gibt es einen Fehler null value in column "timestamp" violates not-null constraint

Für mich ist es wie das uniqueid aussieht, wie eine ganze Zahl nicht erkannt. Wie behebe ich das?

Danke für die Hilfe!

Antwort

1

AutoFields werden von der Datenbank selbst festgelegt. Sie erhalten also erst nach dem Speichern einen Wert. Aber Sie haben zu diesem Zeitpunkt nicht gespeichert, weil Sie commit=False an das Formular speichern übergeben; Dies erstellt eine Instanz im Speicher, sendet sie jedoch noch nicht an die Datenbank.

Wenn Sie möchten, dass dies funktioniert, müssen Sie das commit=False entfernen und die (winzigen) Kosten für das Speichern in der Datenbank zweimal übernehmen.

+0

funktioniert wie ein Charme! Vielen Dank – radzia2

Verwandte Themen