2016-10-04 50 views
1

改變電子郵件地址(初級用戶ID)目前我的用戶表看起來像這樣 - (所有字段不爲null)模式 - 能夠在Django

display_name = CharField     # string 
email_address = EmailField (primary key) # string 
password  = CharField     # string 

不過,我已決定添加額外的功能和允許用戶更改他們的電子郵件地址。

流程是這樣的

enter image description here

有沒有人對如何做到這一點任何想法?

目前,我喜歡

display_name = CharField     # string 
email_address = EmailField (primary key) # string 
password  = CharField     # string 
pending_email = EmailField (unique)  # string 

,簡單思考的東西抱在pending_email新的電子郵件地址email_address

取代舊的電子郵件地址之前,但顯然這是遠遠不夠完善(如pending_email獨特約束沒有涵蓋email_address

我想過,就這樣離開它,並執行更多的選擇對數據庫wi th AJAX查詢來檢查所需的新電子郵件地址在允許輸入pending_email之前是否已存在於email_address中,但由於對數據庫不友好,這似乎仍然容易受到競爭條件和不良用戶體驗的影響。

回答

1

這種情況下的標準做法是爲電子郵件地址創建一個單獨的表。這允許用戶在給定時間有多個電子郵件地址,其中一個可以被標記爲默認。

這就是django-allauth的EmailAddress模型。事實上,除非你有一個非常有說服力的理由來編寫你自己的認證系統,否則我強烈建議你把你的swith改成django allauth或任何廣泛使用的django認證/註冊系統。

class EmailAddress(models.Model): 

    user = models.ForeignKey(allauth_app_settings.USER_MODEL, 
          verbose_name=_('user')) 
    email = models.EmailField(unique=app_settings.UNIQUE_EMAIL, 
           max_length=app_settings.EMAIL_MAX_LENGTH, 
           verbose_name=_('e-mail address')) 
    verified = models.BooleanField(verbose_name=_('verified'), default=False) 
    primary = models.BooleanField(verbose_name=_('primary'), default=False) 

    objects = EmailAddressManager()