Python 使用save_model方法在django admin中创建模型对象

Python 使用save_model方法在django admin中创建模型对象,python,django,Python,Django,我来自php背景,所以python django对我来说是全新的。每当从admin部分创建新用户时,我试图使用save\u model方法从admin.py在account\u emailaddress表中插入一条新记录 以下是models.py class EmailAddress(models.Model): user = models.OneToOneField(User, unique=True, related_name ='address') email = mode

我来自php背景,所以python django对我来说是全新的。每当从admin部分创建新用户时,我试图使用
save\u model
方法从admin.py在
account\u emailaddress
表中插入一条新记录

以下是
models.py

class EmailAddress(models.Model):
    user = models.OneToOneField(User, unique=True, related_name ='address')
    email = models.EmailField()
    verified = models.BooleanField(verbose_name=_('verified'), default=True)
    primary = models.BooleanField(verbose_name=_('primary'), default=True)

    class Meta:
        db_table = 'account_emailaddress'
from django.contrib import admin
from django.contrib.auth import admin as upstream
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group, User
from django.utils.translation import ugettext, ugettext_lazy as _
from .models import EmailAddress



class CustomUserAdmin(UserAdmin):
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    list_select_related = ( 'profile', )

    #exclude = ('username',)

    fieldsets = (
        ('Personal information', {'fields': ('first_name', 'last_name', 'username', 'email', 'password')}),
        ('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', 'email', 'password1', 'password2')}
        ),
    )

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)

    def get_ordering(self, request):
        return ['-date_joined']


    def save_model(self, request, obj, form, change):
        obj.EmailAddress.save()
        obj.save()



admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
admin.py

class EmailAddress(models.Model):
    user = models.OneToOneField(User, unique=True, related_name ='address')
    email = models.EmailField()
    verified = models.BooleanField(verbose_name=_('verified'), default=True)
    primary = models.BooleanField(verbose_name=_('primary'), default=True)

    class Meta:
        db_table = 'account_emailaddress'
from django.contrib import admin
from django.contrib.auth import admin as upstream
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group, User
from django.utils.translation import ugettext, ugettext_lazy as _
from .models import EmailAddress



class CustomUserAdmin(UserAdmin):
    list_display = ('email', 'first_name', 'last_name', 'is_staff')
    list_select_related = ( 'profile', )

    #exclude = ('username',)

    fieldsets = (
        ('Personal information', {'fields': ('first_name', 'last_name', 'username', 'email', 'password')}),
        ('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', 'email', 'password1', 'password2')}
        ),
    )

    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)

    def get_ordering(self, request):
        return ['-date_joined']


    def save_model(self, request, obj, form, change):
        obj.EmailAddress.save()
        obj.save()



admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
我得到一个错误--

------------------更新1开始---------------

来自models.py

class UserProfile(models.Model, HashedPk):
    user = models.OneToOneField(User, unique=True, related_name ='profile')
    job_title = models.CharField(max_length=128, blank=True, null=False, default="")
    website = models.URLField(max_length=255, blank=True, null=True)
    organisation = models.CharField(max_length=50, blank=True, null=True, default="")
    phone_number = PhoneNumberField( blank=True, null=True)

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
        #if the loggedin user is admin or user_created_by admin then create the object 
        #EmailAddress.objects.create(user=instance, email=instance.email)
------------------更新1结束---------------

上面的代码可以工作,但我不能在这里使用它,因为
allauth
app(我在前端用于用户注册)试图在
account\u emailaddress
表中创建同一行,从而产生重复错误

如果用户是由管理员创建的,那么是否可以创建对象


非常感谢您的帮助或建议。提前感谢。

您已经将从用户到电子邮件地址的相关名称定义为
地址
,因此您应该使用:

obj.address.save()

请注意,即使您没有定义此名称,默认的相关名称也是模型名称的小写版本。

我只想为答案添加一些注释。首先,如果您不想使用调试器,您可以通过打印所有属性来检查属性名称
print(dir(obj))
。如果只允许管理员用户创建该对象,则可以在request.user.is\u superuser:的情况下编写此检查。希望这能对您有所帮助。

我试过了,但它说
用户没有地址
。它应该是这样工作的。这意味着你正在保存的特定用户没有相关的EmailAddress对象。你创造了一个吗?哪里显示代码。对不起,我没听明白你的问题。答案是否定的。您可以通过在
save\u model
函数之后编写以下代码
print(dir(obj))
,如果您找不到,请将输出添加到问题中,我们可以帮助您Hanks@latsha我已经更新了帖子。在
save\u model
中,如果请求,您可以这样检查。user.is\u superuser:谢谢您的建议。实际上,它不是检查添加的用户是否是超级管理员,也不是检查用户创建的是否是管理员。我想我要用另一种方式来解释这个问题。让管理员先创建用户,然后从另一个视图确认他的电子邮件。