Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建/编辑/删除用户时,django管理面板中的外键约束失败。(使用自定义用户模型。)_Python_Django_Database_Sqlite - Fatal编程技术网

Python 创建/编辑/删除用户时,django管理面板中的外键约束失败。(使用自定义用户模型。)

Python 创建/编辑/删除用户时,django管理面板中的外键约束失败。(使用自定义用户模型。),python,django,database,sqlite,Python,Django,Database,Sqlite,所以我使用的是自定义用户模型 from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager class UserManager(BaseUserManager): def create_user(self, email, full_name, address, number, password=None): """

所以我使用的是自定义用户模型

    from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class UserManager(BaseUserManager):
    def create_user(self, email, full_name, address, number, password=None):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('Users must have an email address')
        if not full_name:
            raise ValueError('Users must have an email address')
        if not address:
            raise ValueError('Users must have an email address')
        if not number:
            raise ValueError('Users must have an email address')
        if not password:
            raise ValueError('Users must have an email address')

        user = self.model(
            email=self.normalize_email(email.lower()),
            full_name=full_name,
            address = address,
            number=number,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_staffuser(self, email, full_name, address, number, password):
        """
        Creates and saves a staff user with the given email and password.
        """
        user = self.create_user(
            email,
            full_name,
            address,
            numbe,
            password = password,
        )
        user.staff = True
        user.save(using=self._db)
        return user

    def create_superuser(self, email, full_name, address, number, password):
        """
        Creates and saves a superuser with the given email and password.
        """
        user = self.create_user(
            email,
            full_name,
            address,
            number,
            password = password,
        )
        user.staff = True
        user.admin = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    email = models.EmailField(max_length=255, unique=True)
    full_name = models.CharField(max_length=255, blank = False, null = False)
    address = models.CharField(max_length=255, blank = False, null = False)
    number = models.CharField(max_length=255, blank = False, null = False)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False) # a admin user; non super-user
    admin = models.BooleanField(default=False) # a superuser
    # notice the absence of a "Password field", that's built in.

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name', 'address', 'number'] # Email & Password are required by default.

    objects = UserManager()

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def __str__(self):              # __unicode__ on Python 2
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        return self.staff

    @property
    def is_admin(self):
        "Is the user a admin member?"
        return self.admin

    @property
    def is_active(self):
        "Is the user active?"
        return self.active
这是我应用程序的admin.py

    from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

from .forms import UserAdminChangeForm, UserAdminCreationForm
from .models import User

class UserAdmin(BaseUserAdmin):
    # The forms to add and change user instances
    form = UserAdminChangeForm
    add_form = UserAdminCreationForm

    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference specific fields on auth.User.
    list_display = ('email', 'admin')
    list_filter = ('admin',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('full_name', 'address', 'number')}),
        ('Permissions', {'fields': ('admin', 'active', 'staff')}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'full_name', 'address', 'number', 'password1', 'password2')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()


admin.site.register(User, UserAdmin)
admin.site.unregister(Group)
最后形成.py

    from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField

from .models import User

class UserAdminCreationForm(forms.ModelForm):
    """A form for creating new users. Includes all the required
    fields, plus a repeated password."""
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email', 'full_name', 'address', 'number')

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserAdminCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserAdminChangeForm(forms.ModelForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = User
        fields = ('email', 'full_name', 'address', 'number', 'password', 'active', 'admin')

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        return self.initial["password"]

因此,当我使用manage.py通过控制台创建一个超级用户时效果非常好,但是当我决定在gui管理面板中编辑、删除或创建另一个用户时,我会得到一个“外键约束失败”。我不明白,有人能给我指出正确的方向吗?

我四处询问,代码应该可以在django的旧版本中使用。遗憾的是,它在django 2.0或更高版本中无法工作。如果有人想要一个我发现非常适合我的项目的替代方案,解释也很简单

我四处询问,代码应该可以在django的旧版本中使用。遗憾的是,它在django 2.0或更高版本中无法工作。如果有人想要一个我发现非常适合我的项目的替代方案,解释也很简单

我想我已经找到了解决办法。当您将缺省的AutoSuuleRME模型迁移到项目中间的自定义模型时,问题很可能是由循环依赖性问题引起的。

来自Django文档

创建数据库表后更改AUTH_USER_模型要困难得多,因为它会影响外键和多对多关系

此更改无法自动完成,需要手动修复架构,从旧用户表中移动数据,并可能手动重新应用某些迁移。请参见#25313了解步骤的概要

由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_model引用的模型必须在其应用程序的第一次迁移中创建(通常称为0001_initial);否则,您将有依赖性问题

此外,在运行迁移时,您可能会遇到CircularDependency错误,因为Django由于动态依赖关系而无法自动中断依赖循环。如果您看到这个错误,您应该通过将用户模型依赖的模型移动到第二次迁移中来打破循环。(您可以尝试创建两个相互之间有ForeignKey的普通模型,如果您想了解它通常是如何完成的,那么可以查看makemigrations如何解决该循环依赖关系。)

解决此问题的最佳方法是删除表并删除所有迁移文件,然后使用新创建的自定义模型重新运行迁移。希望这能奏效。


有关如何从内置模型迁移到新模型的更多详细信息,请参见此处

我想我已经找到了解决方案。当您将缺省的AutoSuuleRME模型迁移到项目中间的自定义模型时,问题很可能是由循环依赖性问题引起的。

来自Django文档

创建数据库表后更改AUTH_USER_模型要困难得多,因为它会影响外键和多对多关系

此更改无法自动完成,需要手动修复架构,从旧用户表中移动数据,并可能手动重新应用某些迁移。请参见#25313了解步骤的概要

由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_model引用的模型必须在其应用程序的第一次迁移中创建(通常称为0001_initial);否则,您将有依赖性问题

此外,在运行迁移时,您可能会遇到CircularDependency错误,因为Django由于动态依赖关系而无法自动中断依赖循环。如果您看到这个错误,您应该通过将用户模型依赖的模型移动到第二次迁移中来打破循环。(您可以尝试创建两个相互之间有ForeignKey的普通模型,如果您想了解它通常是如何完成的,那么可以查看makemigrations如何解决该循环依赖关系。)

解决此问题的最佳方法是删除表并删除所有迁移文件,然后使用新创建的自定义模型重新运行迁移。希望这能奏效。

有关如何从内置模型迁移到新模型的更多详细信息,请参见django 2.2+:

  • 如果是testdata->,那么您必须删除所有迁移和pycache 从所有应用程序和项目中删除文件夹,并删除“db.sqlite3”文件
  • 进行迁移并迁移应用程序,然后它就可以工作了。 (我也有同样的问题,它使用这种方法工作。)
  • 如果导入数据,您可以使用它轻松备份数据
  • 对于django 2.2+:

  • 如果是testdata->,那么您必须删除所有迁移和pycache 从所有应用程序和项目中删除文件夹,并删除“db.sqlite3”文件
  • 进行迁移并迁移应用程序,然后它就可以工作了。 (我也有同样的问题,它使用这种方法工作。)
  • 如果导入数据,您可以使用它轻松备份数据

  • 警告:它将删除您的整个数据库。如果您有一些重要数据,请按dumpdata备份,然后按loaddata还原

    在项目中期改变AuthuSuurl模型是很困难的。 完成Django表的第一次迁移后,您将面临问题。

    想法是:在django项目的第一次迁移(django在其中创建自己的表,如AUTH_group、dajango_migrations等)中,您需要在setting.py(AUTH_user_model=[custom user model])中包含自定义用户模型及其条目。

    警告:如果您已启动服务器,则Django本身将创建数据库,然后此操作将不起作用,因此请不要启动服务器

    • 删除dbsqlite3数据库文件,删除所有迁移文件及其二进制文件(在app/migration/pycache中)例外