簡體   English   中英

使用save_model方法在Django管理中創建模型對象

[英]Create model object in django admin using save_model method

我來自php背景,因此python-django對我來說是全新的。 每當save_model從admin部分創建新用戶時,我都嘗試使用save_model方法在admin.py中的account_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'

來自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'

------------------更新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 END ---------------

#EmailAddress.objects.create(user=instance, email=instance.email)

上面的代碼有效,但是我不能在這里使用它,因為allauth應用程序(我正在前端中用於用戶注冊)試圖在account_emailaddress表中創建同一行,從而造成重復錯誤。

是否有可能,如果用戶是由admin創建的,則創建對象。

任何幫助或建議,我們將不勝感激。 提前致謝。

您已將從user到EmailAddress的related_name定義為address ,因此應使用:

obj.address.save()

請注意,即使您尚未定義此名稱,默認的related_name也是模型名稱的小寫版本。

我只想在答案中添加一些注釋。 首先,如果您不想使用調試器,則可以通過僅打印所有屬性print(dir(obj))來始終檢查屬性名稱。 如果您只允許管理員用戶創建該對象,則可以if request.user.is_superuser:編寫此檢查。 希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM