AbstractUser Django完整的例子

vai*_*312 10 django django-models django-users python-2.7 django-1.5

我是Django的新手,我已经尝试了几周,但找不到解决这个问题的方法.

我想存储其他信息,如用户手机号码,银行名称,银行帐户.并希望在用户注册时存储手机号码,并希望用户使用(手机号码和密码)或(电子邮件和密码)登录.

这是我的UserProfile模型

from django.db import models
from django.contrib.auth.models import User
from django.contrib.auth.models import AbstractUser
# Create your models here.

class UserProfile(AbstractUser):

     user_mobile = models.IntegerField(max_length=10, null=True)
     user_bank_name=models.CharField(max_length=100,null=True)
     user_bank_account_number=models.CharField(max_length=50, null=True)
     user_bank_ifsc_code = models.CharField(max_length=30,null=True)
     user_byt_balance = models.IntegerField(max_length=20, null=True)
Run Code Online (Sandbox Code Playgroud)

这是我的forms.py

from django import forms            
from django.contrib.auth.models import User   # fill in custom user info then save it 
from django.contrib.auth.forms import UserCreationForm      
from models import UserProfile
from django.contrib.auth import get_user_model

class MyRegistrationForm(UserCreationForm):
    email = forms.EmailField(required = True)
    mobile = forms.IntegerField(required=True)



    class Meta:
        model = UserProfile
        fields = ('username', 'email', 'password1', 'password2','mobile' )        

    def save(self,commit = False):   
        user = super(MyRegistrationForm, self).save(commit = False)
        user.email = self.cleaned_data['email']
        user.user_mobile = self.cleaned_data['mobile']
        user.set_password(self.cleaned_data["password1"])

        user_default = User.objects.create_user(self.cleaned_data['username'],
                                                self.cleaned_data['email'],
                                                self.cleaned_data['password1'])
        user_default.save()

        if commit:
             user.save()

         return user
Run Code Online (Sandbox Code Playgroud)

在我的settings.py中,我已经包括在内

AUTH_USER_MODEL = "registration.UserProfile"
Run Code Online (Sandbox Code Playgroud)

我的应用程序的admin.py是

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from models import UserProfile

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'userprofile'

 class UserProfileAdmin(UserAdmin):
    inlines = (UserProfileInline, )

 admin.site.register(UserProfile, UserProfileAdmin)
Run Code Online (Sandbox Code Playgroud)

从管理员添加用户时,我收到此错误

Exception at /admin/registration/userprofile/1/
<class 'registration.models.UserProfile'> has no ForeignKey to <class 'registration.models.UserProfile'>
Run Code Online (Sandbox Code Playgroud)

有人可以帮我这个或指出完整的工作exapmle,我已经看到Django文档,但没有找到任何运气.或者,如果有另一种方法可以做到这一点.

提前致谢

编辑1:

从注册表中注册时我也遇到了这个错误

DatabaseError at /register
(1146, "Table 'django_auth_db.auth_user' doesn't exist")
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 5

您在这里有些困惑。将AbstractUser子类化并定义AUTH_USER_MODEL为您的子类的想法是,新模型将完全替换auth.models.User。您根本不应该导入原始用户,而您当然应该调用User.objects.create_user():新模型的管理器现在具有自己的create_user方法。

因此,没有理由与内联管理员混为一谈。您的UserProfile应该使用现有的django.contrib.auth.admin.UserAdmin类在admin中注册。

  • 您能否提供一个链接,在这里我可以看到带有注册表单和视图的Django AbstractUser的完整实现。我从两周后就被这里击中找不到出路。 (18认同)

小智 2

内联表单假设您的模型上有一个通用外键,在这种情况下,UserProfileAdmin 期望用户配置文件的通用外键,但该外键不存在。尝试进行常规模型管理,例如:

class UserProfileAdmin(admin.ModelAdmin):
    can_delete = False
    verbose_name_plural = 'userprofile'

admin.site.register(UserProfile, UserProfileAdmin)
Run Code Online (Sandbox Code Playgroud)