2013-09-24 15 views
5

Başarılı bir şekilde oluşturulmuş bir süper kullanıcı ile django yönetici paneline giriş yapmak için saatlerce çalışıyorum, ancak doğru kullanıcı adı/pw combo hakkını alamıyorum.Özel bir kullanıcı modeliyle bir süper kullanıcı oluşturduktan sonra django admin'e giriş yapamıyorum

Kullanıcıların e-postalarını yalnızca kendi kullanıcı adları olarak kullanmasını istiyorum. Ayrıca, örneği Django docs here'da çoğaltmak için elimden geleni yaptım. Taşınmaları sildim, sycndb ve her şey yönetici paneline giriş yapmak dışında çalışır.

ilgili kod: models.py kaynaktan:

from django.db import models 
from django.forms import ModelForm 
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser 

class UserManager(BaseUserManager): 
    def create_user(self, email, password=None): 
     """ 
     Creates and saves a User with the given email 
     """ 
     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=UserManager.normalize_email(email), 
     ) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, email, password): 
     """ 
     Creates and saves a superuser with the given email, date of 
     birth and password. 
     """ 
     user = self.create_user(email, 
      password=password 
     ) 

     user.is_admin = True 
     user.is_staff = True 
     user.is_superuser = True 
     user.save(using=self._db) 
     return user 



class User(AbstractBaseUser): 
    objects = UserManager() 
    date_added = models.DateField(auto_now=False, auto_now_add=True) 
    email = models.EmailField(unique=True, db_index=True) 
    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [] 

    def __unicode__(self): 
     return self.email 

    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    def get_full_name(self): 
    # The user is identified by their email address 
     return self.email 

    def get_short_name(self): 
    # The user is identified by their email address 
     return self.email 

    # On Python 3: def __str__(self): 
    def __unicode__(self): 
     return self.email 

    def has_perm(self, perm, obj=None): 

    # Simplest possible answer: Yes, always 
     return True 

    def has_module_perms(self, app_label): 

    # Simplest possible answer: Yes, always 
     return True 

    def is_staff(self): 

    # Simplest possible answer: All admins are staff 
     return self.is_admin 

admin.py kaynaktan:

from django.contrib import admin 
from app.models import Relationship, Event, User 
from django import forms 
from django.contrib import admin 
from django.contrib.auth.models import Group 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import ReadOnlyPasswordHashField 


class UserCreationForm(forms.ModelForm): 
    """A form for creating new users. Includes all the required 
    fields, plus a repeated password.""" 

    password1 = forms.CharField(label='Password', widget=forms.PasswordInput) 
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput) 

    class Meta: 
     model = User 
     fields = ('email',) 

    def clean_password2(self): 
     # Check that the two password entries match 
     password1 = self.cleaned_data.get("password1") 
     password2 = self.cleaned_data.get("password2") 
     if password1 and password2 and password1 != password2: 
      raise forms.ValidationError("Passwords don't match") 
     return password2 

    def save(self, commit=True): 
     user = super(UserCreationForm, self).save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 


class UserChangeForm(forms.ModelForm): 
    password = ReadOnlyPasswordHashField() 

    class Meta: 
     model = User 

    def clean_password(self): 
     return self.initial["password"] 





class UserAdmin(UserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 


    list_display = ('email', 'is_admin') 
    list_filter = ('is_admin',) 
    fieldsets = (
     (None, {'fields': ('email', 'password')}), 
     ('Permissions', {'fields': ('is_admin',)}), 
    ) 

    add_fieldsets = (
     (None, { 
      'classes': ('wide',), 
      'fields': ('email', 'password1', 'password2')} 
     ), 
    ) 
    search_fields = ('email',) 
    ordering = ('email',) 
    filter_horizontal =() 

admin.site.register(User, UserAdmin) 
admin.site.unregister(Group) 

ilgili settings.py kodu: Bir süper oluşturma ve bunu inceleyen

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.contrib.auth.middleware.RemoteUserMiddleware', 
    # Uncomment the next line for simple clickjacking protection: 
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

ROOT_URLCONF = 'relrem.urls' 

# Python dotted path to the WSGI application used by Django's runserver. 
WSGI_APPLICATION = 'relrem.wsgi.application' 

TEMPLATE_DIRS = (
    # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". 
    # Always use forward slashes, even on Windows. 
    # Don't forget to use absolute paths, not relative paths. 
) 

INSTALLED_APPS = (
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.admin', 
    'app', 
    'south', 

    # Uncomment the next line to enable admin documentation: 
    # 'django.contrib.admindocs', 
) 

AUTH_USER_MODEL = 'app.User' 

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.RemoteUserBackend', 
) 

Örnek terminal çıkışıBir tablo:

Email: [email protected] 
Password: 
Password (again): 
Superuser created successfully. 

[ 
{ 
"pk": 1, 
"model": "app.user", 
"fields": { 
    "is_active": true, 
    "last_login": "2013-09-24T02:09:44.996Z", 
    "is_admin": true, 
    "date_added": "2013-09-23", 
    "password": "", 
    "email": "[email protected]" 
} 
} 
] 

ben ne yaparsan alırım çünkü "Bir personel hesabı için doğru e-posta ve şifrenizi giriniz, şifre kaydedilir ve iade edilen yol ile ilgili bir şey olmalı bence . Her iki alanın da büyük/küçük harf duyarlı olabileceğini unutmayın. "Mesaj. Parolamı" örnek "olarak ayarladım. Pw'yi bozmak ve temizlemekle ilgili tüm kodları kaldırmayı denedim, ancak aslında yine de kullanıcı tablosu.

bütün bu soruya bakmak için zaman alır herkese şimdiden, ben bir şey bariz yanlış yapıyorum sayesinde umuyoruz.

cevap

9

kod gayet iyi. sorun kullandığınız olduğunu RemoteUserBackend münhasıran yerine default backend:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.RemoteUserBackend', 
) 

kendim hiç kullanmadım, ama from the docs isteklerinizi yalnızca REMOTE_USER üstbilgisi için kontrol edeceği ve böylece şifre giriş girişimlerinizin alakasız olacağı açıktır.

hem mevcut olması wan't eğer, son çare olarak varsayılan ModelBackend ekleyebilirsiniz:

AUTHENTICATION_BACKENDS = (
     'django.contrib.auth.backends.RemoteUserBackend', 
     'django.contrib.auth.backends.ModelBackend', 
) 

veya alltogether RemoteUserBackend kurtulmak ve uygulama varsayılan yol kimliğini doğrulamak zorunda olsun.

Bu yardımcı olur umarım.

+0

Bakmak için zaman ayırdığınız için teşekkürler, maalesef hala aynı problem var. AUTHENTICATION_BACKEND hattını ve RemoteUser ile ilgili bir şey sildim ve hala giriş yapamıyorum. – berserkia

+0

@berserkia ayrıca AUTHENTICATION_BACKENDS dosyanıza 'django.contrib.auth.backends.ModelBackend' eklediniz mi? Mevcut ayarlarınızı göstermek için sorunuzu güncelleyebilir misiniz? – kirbuchi

+0

Bunu başardı, teşekkürler @kirbuchi. – berserkia

İlgili konular