2014-02-14 4 views
9

Я новичок в Django, и я пробовал это в течение нескольких недель, но не смог найти способ решить эту проблему.AbstractUser 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) 

И это мой 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 

В моей settings.py я включил

AUTH_USER_MODEL = "registration.UserProfile" 

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) 

При добавлении пользователя от администратора Я получаю эту ошибку

Exception at /admin/registration/userprofile/1/ 
<class 'registration.models.UserProfile'> has no ForeignKey to <class 'registration.models.UserProfile'> 

Может кто-нибудь помочь мне с этим или указать на полный рабочий exapmle, я видел Джанго документации, но не нашли каких-либо успехов. Или если есть другой способ сделать это.

Заранее спасибо

Edit 1:

При регистрации из регистрационной формы я также получаю эту ошибку

DatabaseError at /register 
(1146, "Table 'django_auth_db.auth_user' doesn't exist") 

ответ

1

встраивает формы предполагают, что у вас есть Generic ForeignKey на вашей модели , в этом случае UserProfileAdmin ожидает Generic ForeignKey из UserProfile, который не существует. Попробуйте сделать обычный администратор модели, например:

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

admin.site.register(UserProfile, UserProfileAdmin) 
4

Вы немного смутили себя здесь. Идея подкласса AbstractUser - и определение AUTH_USER_MODEL в качестве вашего подкласса - заключается в том, что новая модель полностью заменяет auth.models.User. Вы не должны импортировать оригинального Пользователя вообще, и вы, безусловно, должны звонить User.objects.create_user(): у вашего менеджера новой модели теперь есть свой собственный метод create_user.

Из-за этого нет причин гадать с встроенными админами. Ваш UserProfile должен быть зарегистрирован в админе, используя существующий класс django.contrib.auth.admin.UserAdmin.

+16

Можете ли вы предоставить ссылку, где я могу увидеть полную реализацию Django AbstractUser с регистрационной формой и представлениями. Я ударил здесь с 2 недель не смог найти выход. – vaibhav1312

+0

Следуйте за этим: [link] (https://wsvincent.com/django-custom-user-model-tutorial/) –

 Смежные вопросы

  • Нет связанных вопросов^_^