我来自php背景,所以python-django对我来说是全新的。我试图从admin.py中使用save_model
方法在account_emailaddress
表中插入新记录,每当从管理部分创建新用户时。使用save_model方法在django admin中创建模型对象
以下是从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'
部分内容从admin.py
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)
我得到一个错误 -
'User' object has no attribute 'EmailAddress'
--------- --------- UPDATE 1 BEGIN ---------------
从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)
------------------ UPDATE 1 END ---------------
#EmailAddress.objects.create(user=instance, email=instance.email)
上面的代码工作,但我不能在这里使用它,因为allauth
应用程序(我用在前台用户注册)在尝试account_emailaddress
的创建表的同一行,从而创建重复错误。
是否有可能这样,如果用户是由管理员创建然后创建对象。
高度赞赏任何帮助或建议。提前致谢。
你可以通过在'save_model'函数后面写入'print(dir(obj))'来找到真实的属性名称,如果你找不到它,请将输出添加到问题中,我们可以帮助你 – latsha
谢谢@latsha我已更新该帖子。在'save_model'中你可以检查' –
'如果request.user.is_superuser:' – latsha