2013-02-15 21 views
6

我有一個自定義用戶模型,擴展AbstractUser。我添加了兩個自定義字段。但我想默認的電子郵件字段是uniqe和必需的。我在網上搜了很多,但找不到一個好的建議。Django 1.5覆蓋abstractuser電子郵件字段是必需和唯一

這是否正確的方式來做擴展的usercreationform與重寫的'clean_email'方法?

感謝名單

回答

0

也許你可以在你的模型覆蓋__init__做出所需要的領域和獨特的。

UPDATE

後,我身邊一個小遊戲已經發現這個說起來容易做(我沒有找到父而required = False需要一個子類製作領域的一種方式)。

+0

我已經創建了模型並添加了一些用戶,所以我無法從擴展abstractuser模型中覆蓋它。它給 - FieldError:類'CustomUser'中的Local email'email'與基類'AbstractUser'中的類似名稱的字段發生衝突 - – ratata 2013-02-15 23:36:00

+0

它給出'unicode'對象沒有屬性'required'錯誤 – ratata 2013-02-15 23:45:14

+0

我找不到問題的解決方案。我認爲最好是擴展'AbstractBaseUser'。 ??? – ratata 2013-02-16 14:01:49

2

email已經在AbstractUser.REQUIRED_FIELDS

使其具有唯一性:

class User(AbstractUser): 
    ... 

(emailField,) = (f for f in User._meta.fields if f.name == "email") 
emailField.unique = True 

還挺哈克但應該工作

或者你可以簡單的擴展AbstractBaseUserAbstractUser自己添加缺少的東西你自定義的調整

+0

如果你在類的主體中運行這個'User'是未定義的(就像'self'一樣)。我在'__init__'中試過並得到'AttributeError:can not set attribute'。 – 2013-02-16 18:39:55

+0

我不會在'__init__'或類定義中的任何地方運行這個。只要把這個**放在**類定義下 – mderk 2013-02-16 18:53:56

+0

在Django 1.7中,它不起作用。我發現這個解決方案工作:http://stackoverflow.com/a/26108834/865664 – 2014-11-12 10:40:27

0

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 
5

林面對,我延長了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 

和它的工作!

+0

所以確定是有用的! ;)謝謝 – pztrick 2014-04-09 15:22:51

+1

這工作在1.6,但應用程序註冊表更改爲1.7。任何想法如何適應這個答案在1.7中使用?原因是你提出''提高AppRegistryNotReady(「模型尚未加載。」)''' – Flowpoke 2014-09-24 16:31:30

+0

對不起Flowpoke,我還沒有移動到1.7,所以我不知道如何解決它。 – steven2308 2014-09-25 21:54:14

0

在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 

這個假設MyAbstractUserAbstractUser一個子類。

你也必須修改__init__.py在應用程序的目錄:

default_app_config = 'your_app_name.apps.YourAppConfig' 

如果您忘記了新ready方法不會被調用。

現在您的系統檢查應該通過。

0
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'] 
相關問題