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

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

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

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Django

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

Python

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

Q&A

解決済

1回答

1509閲覧

【Django】django.db.utils.DataError: (1406, "Data too long for column 'password' at row 1")のエラーが解決できない

kakeru0225

総合スコア37

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Django

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

Python

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

0グッド

0クリップ

投稿2022/06/26 06:45

私自身初学者であり質問も初めてのため、必須情報の過不足があるかもしれませんが、下記内容についてご教示頂けますと幸いです。


<エラーについて>
【概要】
DjangoでWebアプリケーションを開発中(ユーザー登録フォームを作成しており、フォームへのCSSの適用方法やパスワードのValidationに取り組んでいる時にDBを何度か削除→作成していたところその過程でスーパーユーザーを作成できなくなってしまいました)。
スーパーユーザー作成時に、下記のエラーが出てしまいスーパーユーザーを作成することができない。

【詳細】

python

1django.db.utils.DataError: (1406, "Data too long for column 'password' at row 1")

<お伺いしたいこと>
上記エラーの解決方法

<現状の理解>
①passwordフィールドにおけるmax_length以上の文字数を入力している可能性
→max_length=20で設定していることから、①によるエラーではない

python

1password = models.CharField(_("password"), max_length=20, unique=True)

②/adminにアクセスは可能(ログインはもちろんできない)
③データベースへのユーザー情報の保存処理も正常に動作(Mysqlで確認するとフォームからのデータの送信と保存も正常に行われている)

<不明点>
models.pyが原因なのか、そのほかの要素が起因してエラーを起こしているのかが分からず、ご教示頂けますと幸いです。


<ソースコード>
models.py

models.py

1from django.db import models 2from django.contrib.auth.models import PermissionsMixin 3from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager 4from django.core.mail import send_mail 5from django.utils import timezone 6from django.contrib.auth.validators import UnicodeUsernameValidator 7from django.utils.translation import gettext_lazy as _ 8 9 10class UserManager(BaseUserManager): 11 use_in_migrations = True 12 13 def _create_user(self, username, email, password, **extra_fields): 14 if not email: 15 raise ValueError('Emailを入力して下さい') 16 email = self.normalize_email(email) 17 username = self.model.normalize_username(username) 18 user = self.model(username=username, email=email, **extra_fields) 19 user.set_password(password) 20 user.save(using=self.db) 21 return user 22 def create_user(self, username, email, password=None, **extra_fields): 23 extra_fields.setdefault('is_staff', False) 24 extra_fields.setdefault('is_superuser', False) 25 return self._create_user(email, password, **extra_fields) 26 27 def create_superuser(self, username, email, password, **extra_fields): 28 extra_fields.setdefault('is_staff', True) 29 extra_fields.setdefault('is_superuser', True) 30 if extra_fields.get('is_staff') is not True: 31 raise ValueError('is_staff=Trueである必要があります。') 32 if extra_fields.get('is_superuser') is not True: 33 raise ValueError('is_superuser=Trueである必要があります。') 34 return self._create_user(username, email, password, **extra_fields) 35 36 37class CustomUser(AbstractBaseUser, PermissionsMixin): 38 username_validator = UnicodeUsernameValidator() 39 40 username = models.CharField(_("username"), max_length=50, validators=[username_validator], blank=True) 41 email = models.EmailField(_("email_address"), unique=True) 42 password = models.CharField(_("password"), max_length=20, unique=True) 43 password1 = models.CharField(_("password1"), max_length=20, unique=True) 44 is_staff = models.BooleanField(_("staff status"), default=False) 45 is_active = models.BooleanField(_("active"), default=True) 46 date_joined = models.DateTimeField(_("date joined"), default=timezone.now) 47 48 objects = UserManager() 49 USERNAME_FIELD = "email" 50 EMAIL_FIELD = "email" 51 REQUIRED_FIELDS = ['username'] 52

forms.py

forms.py

1from django import forms 2from toppage.models import CustomUser 3from django.core.exceptions import ValidationError 4 5 6class SignUpForm(forms.ModelForm): 7 #password = forms.CharField(max_length=20, widget=forms.PasswordInput()) 8 9 class Meta: 10 model = CustomUser 11 fields = ['username', 'email', 'password', 'password1'] 12 #labels = {'username':"ユーザー名",'email':"メールアドレス",'password':"パスワード"} 13 14 15 def clean_password(self): 16 password = self.cleaned_data['password'] 17 password1 = self.data.get('password1') 18 if password != password1: 19 raise ValidationError('パスワードが一致しません。') 20 return password 21

admin.py

admin.py

1from django.contrib import admin 2from django.contrib.auth.admin import UserAdmin 3from django.contrib.auth.forms import UserChangeForm, UserCreationForm 4from django.utils.translation import gettext_lazy as _ 5from .models import CustomUser 6 7""" 8class MyUserChangeForm(UserChangeForm): 9 class Meta: 10 model = CustomUser 11 fields = '__all__' 12 13class MyUserCreationForm(UserCreationForm): 14 class Meta: 15 model = CustomUser 16 fields = ('email','username') 17""" 18 19class MyUserAdmin(UserAdmin): 20 fieldsets = ( 21 (None, {'fields': ('email', 'password', 'password1' 'username')}), 22 (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), 23 (_('Important dates'), {'fields': ('last_login', 'date_joined')}), 24 ) 25 add_fieldsets = ( 26 (None, { 27 'classes': ('wide',), 28 'fields': ('email', 'password', 'password1'), 29 }), 30 ) 31 """ 32 form = MyUserChangeForm 33 add_form = MyUserCreationForm 34 """ 35 list_display = ('email', 'username', 'password', 'is_staff') 36 list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups') 37 search_fields = ('email', 'username') 38 ordering = ('email', 'username',) 39 40admin.site.register(CustomUser, MyUserAdmin)

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

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

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

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

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

guest

回答1

0

ベストアンサー

パスワードはset_password関数でハッシュ化して保存されているので、max_length=20では足りないということではないでしょうか?

投稿2022/06/26 13:37

harakazu

総合スコア150

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

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

kakeru0225

2022/06/26 13:46

夜分でのご回答ありがとうございます! max_length=200に引き上げることで、スーパーユーザーを作成することができました。 正しくエラーは読めていたのですが、パスワードのハッシュ化が抜けていたので、一度テスト的にmax_lengthを変えるなど試してみるべきでした。二日ほどエラーに関して色々試していたので、ようやく次に進めそうです。 ご教示頂き有難うございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問