質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3787閲覧

Django 自動採番がうまく出来ない

nuko3

総合スコア31

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/27 02:51

前提・実現したいこと

新規登録画面を作っていまして、ID(文字列)を自動採番するようにしたのですが、1回目はきちんと自動裁判されるようになっていましたが、2回目以降は1回目と同じ番号になってしまい、プロジェクトを再起動しなければ次の採番が行われません。
まだ理解が浅く、どこを改善すればいいのか教えていただけないでしょうか。
IDは"A-B-18-001""A-B-18-002"と語尾の数字が自動採番するようにしています。

該当のソースコード

python

1#forms.py 2class CreateForm(forms.ModelForm): 3 #IDの先頭をDBから取得 4 cursor = connection.cursor() 5 cursor.execute("SELECT TOP 1 ID from IdOrder Order by ID DESC") 6 idstr = cursor.fetchall() 7 #リストの中のタプルに存在している状態になってる 8 #リストから取り出し 9 idstr = idstr[0] 10 #タプルから取り出し 11 idstr = idstr[0] 12 #分割→語尾3桁を数値型にし1足してデフォルト値の計算 13 idstr = repo.split('-') 14 idint = int(idstr[3]) 15 idint = idint + 1 16 idstr3 = str(idint) 17 idstr3 = idstr3.zfill(3) 18 idstr = idstr[0] + "-" + idstr[1] + "-" + idstr[2] + "-" + idstr3 19 20 ID = forms.CharField(label='ID', max_length=50, widget=forms.TextInput(), initial=idstr) 21 Hakko_date = forms.DateField(label='発行日', widget=datetimepicker.DatePickerInput(format='%Y-%m-%d',options={'locale': 'ja','dayViewHeaderFormat': 'YYYY年 MMMM',})) 22 Hachu_nai = forms.CharField(label='発注内容', max_length=200, widget=forms.TextInput()) 23 24 class Meta: 25 model = Idorder 26 fields = ('ID', 'Hakko_date', 'Hachu_nai') 27

python

1views.py 2class CreateView(LoginRequiredMixin, generic.CreateView): 3 login_url = '/accounts/login/' 4 model = Idorder 5 form_class = CreateForm 6 template_name = 'polls/create.html' 7 success_url ='/polls/'

html

1{% extends 'polls/layout.html' %} 2{% load custom_filters %} 3{% load static %} 4{% block title %}発注台帳{% endblock title %} 5{% block header %}<p>発注台帳 新規作成</p>{% endblock %} 6{% block content %} 7 8 <br /> 9 <br /> 10<div class="content"> 11<form method="post"> 12 {% csrf_token %} 13 <table> 14 {{ form.as_table }} 15 </table> 16 <input type="submit" value="作成"> 17 <a href="/polls/">キャンセル</a> 18</form> 19</div> 20{% endblock %}

補足情報(FW/ツールのバージョンなど)

Python:3.7
Django:2.1:2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

採番の処理を関数にしたら出来ました。お騒がせしてすみません。

python

1#forms.py 2def get_idstr(): 3 cursor = connection.cursor() 4 cursor.execute("SELECT TOP 1 ID from IdOrder Order by ID DESC") 5 idstr = cursor.fetchall() 6 idstr = idstr[0] 7 idstr = idstr[0] 8 idstr = repo.split('-') 9 idint = int(idstr[3]) 10 idint = idint + 1 11 idstr3 = str(idint) 12 idstr3 = idstr3.zfill(3) 13 idstr = idstr[0] + "-" + idstr[1] + "-" + idstr[2] + "-" + idstr3 14 return idstr 15 16class CreateForm(forms.ModelForm): 17 ... 18 ID = forms.CharField(label='ID', max_length=50, widget=forms.TextInput(), initial=get_idstr) 19 ...

投稿2018/11/27 04:24

nuko3

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問