2017-02-27 7 views
0

ユーザー登録に使用するフォームがあり、カスタムユーザーマネージャで定義されている同じcreate_user関数を使用したいと考えていますが、値は入力されたものに対応しない方法でデータベースに格納され、代わりに、フォームに与えられたものではなく、ユーザーのemail_addressが「abstractuser.MyUser.object」として入力されます。このコードを修正して正しい値をcreate_user関数に渡し、ユーザーを正常に作成するにはどうすればよいですか?おかげさまで フォームを介してカスタムcreate_userへの呼び出しが失敗します

Models.py

from __future__ import unicode_literals 

from django.db import models 
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin 

# Create your models here. 
class MyManager(BaseUserManager): 
    def create_superuser(self, email_address, password): 
     superuser = MyUser() 
     superuser.email_address = email_address 
     superuser.set_password(password) 
     superuser.is_staff = True 
     superuser.is_superuser = True 
     superuser.save() 

    def create_user(self, email_address, password): 
     user = MyUser() 
     user.email_address = email_address 
     user.set_password(password) 
     user.is_staff = True 
     user.is_superuser = False 
     user.save() 
     return user 

class MyUser(AbstractBaseUser, PermissionsMixin): 
    email_address = models.EmailField(unique=True, max_length=100) 
    is_staff = models.BooleanField(default=0) 

    object = MyManager() 

    USERNAME_FIELD = 'email_address' 

    def get_short_name(self): 
     return self.email_address 

Forms.py

from django.forms import ModelForm 
from django import forms 
from models import MyUser 

class AuthForm(ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput) 
    class Meta: 
     model = MyUser 
     fields = ['email_address', 'password'] 

Views.py

from django.shortcuts import render 
from forms import AuthForm 
from django.contrib.auth import get_user_model 

# Create your views here. 
def user_create(request): 
    if request.method == "POST": 
     get_user_model().object.create_user(self, request.POST) 

    return render(request, 'abstractuser/user_create.html', {'form': AuthForm}) 

EDIT

が入力ありがとうございました、私はCREATE_USER機能に自己のパラメータを追加し、CREATE_USERへの呼び出しに自己パラメータを追加したが、しかし、今、私はエラーを取得し、「グローバル名 『自己』です定義されていません '。このシナリオで自己を得る適切な方法は何ですか?

TRACEBACK

Environment: 


Request Method: POST 
Request URL: http://localhost:8000/user/create 

Django Version: 1.10.5 
Python Version: 2.7.12 
Installed Applications: 
['abstractuser', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "/home/dev/.local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/home/dev/.local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/home/dev/.local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/home/dev/DjangoProjects/abstracttest/abstractuser/views.py" in user_create 
    8.   get_user_model().object.create_user(self, request.POST) 

Exception Type: NameError at /user/create 
Exception Value: global name 'self' is not defined 
+0

[このソース](https://github.com/django/django/blob/master/django/contrib/auth/models.py#L151-L154)を参照してください。また、 'self'パラメータについても見逃しません。 –

+0

@SancaKembangありがとうございます。私はそれを追加しましたが、まだ問題があります。編集をご覧ください。 – xec86

+0

また、あなたのビュー内でそれを使用しないでください...しかし、 'def create_user(self、email_address、password):' –

答えて

0

ご入力のためにあなたにSancaをありがとう、しかし、これは

get_user_model().object.create_user(request.POST['email_address'],request.POST['password']) 

とmodels.py views.py MyManager user_create関数に以下の追加で解決されました.create_userは次のようになります。

def create_user(self, email_address, password): 
    user = MyUser() 
    user.email_address = email_address 
    user.set_password(password) 
    user.is_staff = True 
    user.is_superuser = False 
    user.save() 
    return user 
関連する問題