2017-08-14 171 views
1

我来自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的创建表的同一行,从而创建重复错误。

是否有可能这样,如果用户是由管理员创建然后创建对象。

高度赞赏任何帮助或建议。提前致谢。

+0

你可以通过在'save_model'函数后面写入'print(dir(obj))'来找到真实的属性名称,如果你找不到它,请将输出添加到问题中,我们可以帮助你 – latsha

+0

谢谢@latsha我已更新该帖子。在'save_model'中你可以检查' –

+0

'如果request.user.is_superuser:' – latsha

回答

2

您已经定义从用户的related_name到EmailAddress的为address,所以这是你应该使用什么:

obj.address.save() 

注意,即使你没有定义,缺省related_name是小写型号名称的版本。

+0

我试过但是它说'用户没有地址'。它应该以这种方式工作。 –

+0

这是告诉你,你正在保存的特定用户没有相关的EmailAddress对象。你创建了一个吗?哪里?显示该代码。 –

+0

对不起,我错过了解你的问题。答案是不。 –

0

我只是想添加一些注释来解答。如果你不想使用调试器,首先你可以通过打印所有属性print(dir(obj))来检查属性名称。如果你想只允许管理员用户创建这个对象,你可以写这个检查if request.user.is_superuser:。希望这会帮助你。

+0

感谢您的建议。实际上它不检查添加的用户是否是超级管理员,而是检查用户是否创建了管理员或不管理。我想我会以另一种方式来解决这个问题。让管理员先创建用户,然后从另一个视图确认他的电子邮件。 –

相关问题