2013-05-19 12 views
5

मैं कम से डॉक्स पढ़ रहा हूँ: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#substituting-a-custom-user-modelसेट ईमेल Django में उपयोगकर्ता नाम के रूप में 1.5

तो मेरी settings.py में मैं डाल:

AUTH_USER_MODEL = 'membership.User' 

और मेरी सदस्यता एप्लिकेशन models.py में मैं इस है:

from django.contrib.auth.models import AbstractBaseUser 

class User(AbstractBaseUser): 
    USERNAME_FIELD = 'email' 

रनिंग अजगर manage.py syncdb मुझे दे रहा है:

FieldDoesNotExist: User has no field named 'email' 
,210

मैं AbstractBaseUser वर्ग स्रोत की जाँच करें और क्षेत्र, निश्चित रूप से परिभाषित किया गया है के रूप में आप देख सकते हैं: https://github.com/django/django/blob/master/django/contrib/auth/models.py#L359

क्या गलत है?

उत्तर

18

AbstractBaseUser में ईमेल फ़ील्ड नहीं है, AbstractUser करता है।

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager,\ 
    PermissionsMixin 
from django.db import models 
from django.utils.translation import ugettext_lazy as _ 
from django.utils import timezone 
from django.utils.http import urlquote 


class CustomUserManager(BaseUserManager): 

    def create_user(self, email, password=None, **extra_fields): 
     """ 
     Creates and saves a User with the given email and password. 
     """ 
     now = timezone.now() 
     if not email: 
      raise ValueError('The given email must be set') 
     email = CustomUserManager.normalize_email(email) 
     user = self.model(email=email, 
          is_staff=False, is_active=True, is_superuser=False, 
          last_login=now, date_joined=now, **extra_fields) 

     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password, **extra_fields): 
     u = self.create_user(email, password, **extra_fields) 
     u.is_staff = True 
     u.is_active = True 
     u.is_superuser = True 
     u.save(using=self._db) 
     return u 


class User(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(_('email address'), unique=True) 
    first_name = models.CharField(_('first name'), max_length=30, blank=True) 
    last_name = models.CharField(_('last name'), max_length=30, blank=True) 
    is_staff = models.BooleanField(_('staff status'), default=False, 
     help_text=_('Designates whether the user can log into this admin ' 
        'site.')) 
    is_active = models.BooleanField(_('active'), default=True, 
     help_text=_('Designates whether this user should be treated as ' 
        'active. Unselect this instead of deleting accounts.')) 
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now) 

    objects = CustomUserManager() 

    USERNAME_FIELD = 'email' 

    class Meta: 
     verbose_name = _('user') 
     verbose_name_plural = _('users') 

    def get_absolute_url(self): 
     return "https://stackoverflow.com/users/%s/" % urlquote(self.pk) 

    def get_full_name(self): 
     """ 
     Returns the first_name plus the last_name, with a space in between. 
     """ 
     full_name = '%s %s' % (self.first_name, self.last_name) 
     return full_name.strip() 

    def get_short_name(self): 
     "Returns the short name for the user." 
     return self.first_name 

    # define here other needed methods 
    # Look at django.contrib.auth.models.AbstractUser 

इसके अलावा,:

आप एक अद्वितीय पहचानकर्ता के रूप में ईमेल का उपयोग करना चाहते हैं, तो आप AbstractBaseUser से उपवर्ग और unique=True के साथ ईमेल फ़ील्ड निर्धारित है और यह भी अन्य कार्यक्षमता लिखने के लिए, मॉडल के उदाहरण Manager के लिए की जरूरत है आप शायद इस उपयोगकर्ता को व्यवस्थापक पृष्ठ में जोड़ना चाहेंगे। UserAdmin पर देखें और इसे नए उपयोगकर्ता मॉडल के साथ संगत होने के लिए फिर से परिभाषित करें, जो ईमेल फ़ील्ड को अद्वितीय पहचानकर्ता के रूप में उपयोग करें।

+0

मैं हो रही है "FieldError जाँच कर सकते हैं: में वर्ग 'उपयोगकर्ता' स्थानीय क्षेत्र 'ईमेल' सार तत्व से विरासत के बाद बेस क्लास 'सारस्ट्रूसर' से समान नाम के क्षेत्र के साथ संघर्ष। –

+0

उत्तर अपडेट किया गया। सबसे पहले मैं बस उल्लेख करता हूं कि सारबेसबेस उपयोगकर्ता के पास ईमेल फ़ील्ड नहीं है, लेकिन यह सवाल में लिखा गया था, यह करता है। – stalk

3

दुर्भाग्य से django.contrib.auth भीतर कुछ भी नहीं है कि आप केवल एक मॉडल उपयोगकर्ता नाम के स्थान पर

  1. ईमेल पता और

  2. अन्य django.contrib.auth -stuff, समूहों की तरह के साथ अच्छी तरह काम करता है कि प्राप्त करने के लिए उपवर्ग कर सकते हैं ।

सरल दृष्टिकोण django.contrib.auth से models.py, admin.py और forms.py कॉपी करने के लिए, हर जगह उपयोगकर्ता नाम बाहर चीर और ईमेल पते में यह जगह है में डाल दिया है। मैंने बस यही किया है और मैं इसे कुछ क्लाइंट प्रोजेक्ट्स में सफलतापूर्वक उपयोग कर रहा हूं।

मैं GitHub और pypi पर डाल दिया है, ताकि आप

pip install django-libtech-emailuser 

साथ स्थापित करें और usage instructions on github

+0

Django 1.5 में बहुत अच्छा काम करता है। मैंने आपके ऐप को जिथब पर दिए गए निर्देशों के साथ स्थापित किया है, और उसके बाद 'ejango.contrib.auth.models से उपयोगकर्ता' आयात करने के लिए 'eususer.models आयात ईमेल यूज़र' के साथ 'यूजर' के किसी संदर्भ के साथ किसी भी उदाहरण को बदल दिया है। 'ईमेल यूज़र 'के साथ। निश्चित नहीं है कि उपयोगकर्ता नाम के लिए ईमेल का उपयोग करने का सामान्य अभ्यास डीजेगो के लिए कुछ भी छोटा नहीं होगा, लेकिन यह 1.5 में इन नई सुविधाओं के साथ भी है। साझा करने के लिए धन्यवाद। – Banjer

संबंधित मुद्दे