2017-07-17 11 views
0

Pythonで新しく、エラーコードの解決に苦労しています。'NoneType'オブジェクトに属性がありません 'to_bytes'

私は、postgresqlデータベースに行を追加するフォームを持っています。フォームには、私のmodels.pyの中にプライマリキーであるautofieldがあります。そのような作品としての行を追加し、一意IDフィールドはintededのようにカウントアップ(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"] 

目的は、プライマリキー値(hereに従う整数である)を使用し、それを「バイト」に変換し、次にバイトコードからベースコードへの変換を行ってshortcode-urlを作成することです。このショートコードをテーブルの中に保存したい。私はviews.pyでこれをやろう

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() 

私の問題:私はこのショートのURLを作成することに成功していないと "NoneType" を取得しています

エラー。私はBigIntegerFieldとIntegerFieldにmodels.pyを変更しようとしましたが、うまくいきませんでした。 uniqueid = models.AutoField(primary_key=True)" default=0 "を追加するとエラーに私は、フォームを提出した最初の時間を発生していないが、2番目のフォームを提出するときに、それは整数のように認識されていない私にはnull value in column "timestamp" violates not-null constraint

が、それはuniqueidのように見えるエラーになります。これを修正するには?

ありがとうございました!

答えて

1

AutoFieldはデータベース自体によって設定されるため、保存した後で値を取得しないでください。しかし、あなたはその時点で保存していません。これは、commit=Falseをフォームの保存に渡したためです。メモリ内にインスタンスが作成されますが、まだデータベースには送信されません。

これを機能させたい場合は、それを削除してcommit=Falseを削除し、dbに2回保存する(わずかな)コストを受け入れる必要があります。

+0

は魅力的です!ありがとう – radzia2

関連する問題