我有一個自定義用戶模型,擴展AbstractUser。我添加了兩個自定義字段。但我想默認的電子郵件字段是uniqe和必需的。我在網上搜了很多,但找不到一個好的建議。Django 1.5覆蓋abstractuser電子郵件字段是必需和唯一
這是否正確的方式來做擴展的usercreationform與重寫的'clean_email'方法?
感謝名單
我有一個自定義用戶模型,擴展AbstractUser。我添加了兩個自定義字段。但我想默認的電子郵件字段是uniqe和必需的。我在網上搜了很多,但找不到一個好的建議。Django 1.5覆蓋abstractuser電子郵件字段是必需和唯一
這是否正確的方式來做擴展的usercreationform與重寫的'clean_email'方法?
感謝名單
也許你可以在你的模型覆蓋__init__
做出所需要的領域和獨特的。
UPDATE
後,我身邊一個小遊戲已經發現這個說起來容易做(我沒有找到父而required = False
需要一個子類製作領域的一種方式)。
email
已經在AbstractUser.REQUIRED_FIELDS
。
使其具有唯一性:
class User(AbstractUser):
...
(emailField,) = (f for f in User._meta.fields if f.name == "email")
emailField.unique = True
還挺哈克但應該工作
或者你可以簡單的擴展AbstractBaseUser
從AbstractUser
自己添加缺少的東西你自定義的調整
如果你在類的主體中運行這個'User'是未定義的(就像'self'一樣)。我在'__init__'中試過並得到'AttributeError:can not set attribute'。 – 2013-02-16 18:39:55
我不會在'__init__'或類定義中的任何地方運行這個。只要把這個**放在**類定義下 – mderk 2013-02-16 18:53:56
在Django 1.7中,它不起作用。我發現這個解決方案工作:http://stackoverflow.com/a/26108834/865664 – 2014-11-12 10:40:27
mderk的答案並不完全適用於我 - 我得到了AttributeError: can't set attribute
。原因是內部Django在self._unique
中保存了unique
的值。
因此,爲了使長話短說:
class User(AbstractUser):
...
(emailField,) = (f for f in User._meta.fields if f.name == "email")
emailField._unique = True
作品。
甚至更好:
User._meta.get_field('email')._unique = True
林面對,我延長了AbstractUser同樣的問題,因爲我只需要添加信息。這只是爲我工作的事情:
AbstractUser._meta.get_field('email')._unique = True
這解決了獨特的問題,但我仍然不能讓它要求,當您擴展AbstractUser它的電子郵件字段不是,它可以,如果你添加應注意一個來自管理員的擴展用戶,也因爲表單不會這樣。
我已經試過
AbstractUser._meta.get_field('email')._blank = False
AbstractUser._meta.get_field('email')._null = False
但它似乎並沒有工作。
編輯: 對於某種原因,獨一無二的作品「_」,但空,空不,我只是嘗試這樣做
AbstractUser._meta.get_field('email').blank = False
AbstractUser._meta.get_field('email').null = False
和它的工作!
所以確定是有用的! ;)謝謝 – pztrick 2014-04-09 15:22:51
這工作在1.6,但應用程序註冊表更改爲1.7。任何想法如何適應這個答案在1.7中使用?原因是你提出''提高AppRegistryNotReady(「模型尚未加載。」)''' – Flowpoke 2014-09-24 16:31:30
對不起Flowpoke,我還沒有移動到1.7,所以我不知道如何解決它。 – steven2308 2014-09-25 21:54:14
在Django 1中,這裏給出的有點冒險但有效的解決方案不起作用。7
User._meta.get_field('email')._unique = True
這是因爲訪問模塊範圍的模型違反AppRegistry斷言模式不應該被修改,直到加載完成:
django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
您可以使用App Loading新的功能來做到這一點爲你。使用ready
方法定義AppConfig類,該方法在您的應用程序目錄中執行apps.py
中的猴子補丁。
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name="your_app_name"
def ready(self):
from .models import MyAbstractUser
MyAbstractUser._meta.get_field_by_name('email')[0]._unique=True
這個假設MyAbstractUser
是AbstractUser
一個子類。
你也必須修改__init__.py
在應用程序的目錄:
default_app_config = 'your_app_name.apps.YourAppConfig'
如果您忘記了新ready
方法不會被調用。
現在您的系統檢查應該通過。
AbstractUser._meta.get_field('email')._unique = True
AbstractUser._meta.get_field('email').blank = False
AbstractUser._meta.get_field('email').null = False
它的工作,我檢查數據庫。但是,當我從默認管理頁面創建用戶時,它將創建它,而且沒有問題,並且電子郵件字段爲空。它只會在您嘗試保存時詢問電子郵件。 但它仍然是一個goog解決方案。 我甚至不需要sudo。 我建議在從視圖創建新用戶時確保您需要電子郵件。 *使用Django 1.10和SQLITE3
這也將讓您的域的概念,您可以覆蓋:
(如果有人發現一種方法,使您在創建它,請發表評論字段需要:) )
dir(User._meta.get_field('email'))
Out[3]:
['__class__',
'__copy__',
'__deepcopy__',
'__delattr__',
'__dict__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattribute__',
'__gt__',
'__hash__',
'__init__',
'__le__',
'__lt__',
'__module__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__unicode__',
'__weakref__',
'_blank',
'_check_backend_specific_checks',
'_check_choices',
'_check_db_index',
'_check_deprecation_details',
'_check_field_name',
'_check_max_length_attribute',
'_check_null_allowed_for_primary_keys',
'_description',
'_error_messages',
'_get_flatchoices',
'_get_lookup',
'_get_val_from_obj',
'_unique',
'_unregister_lookup',
'_validators',
'_verbose_name',
'attname',
'auto_created',
'auto_creation_counter',
'blank',
'cached_col',
'check',
'choices',
'class_lookups',
'clean',
'clone',
'column',
'concrete',
'contribute_to_class',
'creation_counter',
'db_check',
'db_column',
'db_index',
'db_parameters',
'db_tablespace',
'db_type',
'db_type_suffix',
'deconstruct',
'default',
'default_error_messages',
'default_validators',
'description',
'editable',
'empty_strings_allowed',
'empty_values',
'error_messages',
'flatchoices',
'formfield',
'get_attname',
'get_attname_column',
'get_cache_name',
'get_choices',
'get_col',
'get_db_converters',
'get_db_prep_save',
'get_db_prep_value',
'get_default',
'get_filter_kwargs_for_object',
'get_internal_type',
'get_lookup',
'get_pk_value_on_save',
'get_prep_value',
'get_transform',
'has_default',
'help_text',
'hidden',
'is_relation',
'many_to_many',
'many_to_one',
'max_length',
'model',
'name',
'null',
'one_to_many',
'one_to_one',
'pre_save',
'primary_key',
'register_lookup',
'rel',
'rel_db_type',
'related_model',
'remote_field',
'run_validators',
'save_form_data',
'select_format',
'serialize',
'set_attributes_from_name',
'system_check_deprecated_details',
'system_check_removed_details',
'to_python',
'unique',
'unique_for_date',
'unique_for_month',
'unique_for_year',
'validate',
'validators',
'value_from_object',
'value_to_string',
'verbose_name']
我已經創建了模型並添加了一些用戶,所以我無法從擴展abstractuser模型中覆蓋它。它給 - FieldError:類'CustomUser'中的Local email'email'與基類'AbstractUser'中的類似名稱的字段發生衝突 - – ratata 2013-02-15 23:36:00
它給出'unicode'對象沒有屬性'required'錯誤 – ratata 2013-02-15 23:45:14
我找不到問題的解決方案。我認爲最好是擴展'AbstractBaseUser'。 ??? – ratata 2013-02-16 14:01:49