(22-02-26)


UserAdminエラー
ログイン・ページにログインしているユーザー・エントリで、ユーザーを追加しようとすると、次のエラーが発生します.

フィールドにユーザー名フィールドを定義していませんか?
#django.contrib.auth.admin
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    add_form_template = 'admin/auth/user/add_form.html'
    change_user_password_template = None
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
        }),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2'),
        }),
    )
    ...
UserAdminとして定義されるソースコード.add_fieldsets項にusernameフィールドが記載されていることがわかる.UserAdminが定義を継承するため、入力するフィールドセットを「admin」ページで定義する必要があります.
class MyAdminAccounts(UserAdmin):
    model = Account
    list_display = ('email','first_name','last_name','is_employee', 'is_employer')
    list_filter = ('email', 'first_name', 'last_name', 'is_employee', 'is_employer')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email', 'first_name')
    #readonly_fields = ['date_joined']

    add_fieldsets = (
        (None, {
            'classes':('wide',),
            'fields':('email','first_name','last_name','password1','password2','is_employee', 'is_employer','is_active')
        }),
    )
スタックオーバーフローadd fieldsets add_fieldsets:ユーザーの作成時に表示される設定fieldsets:Adminページユーザーの変更時に表示される設定

長期公式文書ModelAdmin。readonly_fields
フィールドがauto_now_add=Trueに設定されている場合は、変更、生成できない場合があります.徳民は割引価格で、すべてのフィールドはeditableです.
したがって、auto_nowまたはauto_now_addの属性がTrueのフィールドはmodeladminでは変更できません.
class MyAdminAccounts(UserAdmin):
    model = Account
    list_display = ('email','first_name','last_name','is_employee', 'is_employer')
    list_filter = ('email', 'first_name', 'last_name', 'is_employee', 'is_employer')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email', 'first_name')
    readonly_fields = ['date_joined']
...

ユーザーを作成したら、ユーザーを変更できるページに移動します.fieldsets度を定義する必要があります.
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .models import Account

# Register your models here.

class MyAdminAccounts(UserAdmin):
    model = Account
    list_display = ('email','first_name','last_name','is_employee', 'is_employer')
    list_filter = ('email', 'first_name', 'last_name', 'is_employee', 'is_employer')
    search_fields = ('email', 'first_name', 'last_name')
    ordering = ('email', 'first_name')
    readonly_fields = ['date_joined']

    fieldsets = (
        (None, {'classes': ('wide',), 'fields': ('email', 'first_name', 'last_name', 'password')}),
        ('Permissionsl', {'fields':('is_staff', 'is_active','is_employee', 'is_employer')})
    )

    # The add_fieldsets class variable is used to define the fields that will be displayed on the create user page.
    add_fieldsets = (
        (None, {
            # The classes key sets any custom CSS classes we want to apply to the form section.
            'classes':('wide',),

            # The fields key sets the fields you wish to display in your form.
            'fields':('email','first_name','last_name','password1','password2','is_employee', 'is_employer','is_active')
        }),
    )

admin.site.register(Account, MyAdminAccounts)
次に更新し、

foreignkey移行エラー
from django.conf import settings
from django.db import models

# Create your models here.
from django.template.defaultfilters import slugify

class Category(models.Model):
    title = models.CharField(max_length=100)
    slug = models.SlugField(editable=False, default=None)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)


class Job(models.Model):
    title = models.CharField(max_length=200)
    company = models.CharField(max_length=300)

    CHOICES = (
        ('full_time', 'Full Time'),
        ('part_time', 'Part Time'),
        ('freelance', 'Freelance'),
        ('internship', 'Internship'),
        ('temporary', 'Temporary'),
    )

    job_type = models.CharField(max_length=200, blank=False, default=None, choices=CHOICES)
    location = models.CharField(max_length=200, blank=False, default=None)
    description = models.TextField(blank=False, default=None)
    publishing_date = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(default=None, editable=False)
    employer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='jobs')


    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.title

    class Meta:
        ordering = ('-id',)
前述したように、移行を行うとエラーメッセージが出力されます.
django.db.utils.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`dolphin`.`#sql-db11_81`, CONSTRAINT `jobs_job_category_id_fd8331ed_fk_jobs_category_id` FOREIGN KEY (`category_id`) REFERENCES `jobs_category` (`id`))')
既存のインスタンスが所有するforeignkeyがないため、既存のJobモデルにforeignkeyフィールドが新しく作成されました.
接続されたモデルは存在する必要があるようです.
解決:
新しく作成されたcategoryモデルとJobモデルで作成されたforeignkeyフィールドについてコメント、移行、移行を行います.
settings.pyでは、DATABASEエントリにOPTIONSが追加されます.
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        ...
        
        'HOST': 'localhost',
        'PORT': '3306',
        'OPTIONS': {
            "init_command" : "SET foreign_key_checks = 0",
            # foreignkey의 "반드시 관계가 연결되어 있어야 함"을 꺼버린다.
        }
    }
}
コメントが処理された部分を返し、再移行、移行します.
すると、エラーメッセージには同じ名前のテーブルがすでに存在することが表示されます.
django.db.utils.OperationalError: (1050, "Table 'jobs_category' already exists")
テーブルのパージ、再移行、移行.