2016-12-24 104 views
2

我想的第一個名字和姓氏存儲直接從Facebook的API的用戶驗證模型(這是擴展了FacebookProfile模型,包含webpull,ID和year_formed)UNIQUE約束失敗:auth_user.username

Models.py

class FacebookProfile(models.Model): 
    user = models.OneToOneField(User, on_delete = models.CASCADE) 


    id = models.PositiveIntegerField(primary_key = True) 
    #name = models.CharField(max_length = 200, null = True) 
    year_formed = models.PositiveIntegerField(default = 0) 
    webpull= models.CharField(max_length =1000, null = True) 

Views.py

if request.method == 'GET': 
    print 'im here' 

    return render(request, "logV2.html") 
if request.method == "POST": 
    first_name = request.POST.get('first_name') 
    last_name = request.POST.get('last_name') 
    print first_name, last_name 

    facebook_user = FacebookUserForm(data=request.POST) 
    facebook_profile = FacebookProfileForm() 

    has_account = authenticate(first_name = first_name, last_name = last_name) 

    if has_account: 
     print 'this has account' 
     login(request, has_account) 
     return HttpResponseRedirect('/music/home/') 
    else: 
     id_ = request.POST.get('id') 
     birthday = request.POST.get('year_formed') 
     webpull = request.POST.get('webpull') 

     if birthday == "undefined": 
      print 'im emplty' 
      year_formed = random.randint(1993,1998) 
     else: 
      year_formed = re.findall(r"[0-9][0-9][0-9][0-9]$", birthday)[0] 

     print id_, year_formed, webpull 

     print facebook_user 

     user = facebook_user.save() 
     profile = facebook_profile.save(commit = False) 
     profile.user = user 
     profile.webpull = webpull 
     profile.id = id_ 

     ## steal birtday fucntion from log 
     # move to new database facebook (neeed to change all artists to facebookprofile) 
     profile.year_formed = year_formed 
     profile.save() 



     #authenticate user. then log him in. 
     #user = authenticate(username = profile.user.username) 
     now_has_account = authenticate(first_name = first_name, last_name = last_name) 
     login(request, now_has_account) 


     #profile.save() 
     return HttpResponseRedirect('/music/home/') 

在視圖代碼剎車在user = facebook_user.save()

我試圖清除整個數據庫,

我正在從HTML接收與名字,姓氏,ID,形式year_formed,webpull 。數據到後端罰款。

Forms.py

class FacebookUserForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('first_name', 'last_name') 

class FacebookProfileForm(forms.ModelForm): 
    class Meta: 
     model = FacebookProfile 
     fields = ('id', 'year_formed', 'webpull',) 

什麼IM驗證 Auth_Backend.py

class OnlynameandsurnameAuth(ModelBackend): 
    def authenticate(self, first_name = None, last_name = None): 
     try: 
      return User.objects.get(first_name = first_name, last_name = last_name) 
     except: 
      return None 

然後 auth.py

admin.site.register(FacebookProfile) 

後端認證 settings.py

AUTHENTICATION_BACKENDS = (
    # ... your other backends 
    #'music.auth_backend.PasswordlessAuthBackend', 
    'music.auth_backend.OnlynameandsurnameAuth', 
) 

任何想法如何保存FIRST_NAME和姓氏不具有唯一的錯誤?

謝謝! :d

回答

1

如果使用默認的身份驗證功能不提供密碼應該總是失敗,這意味着

has_account = authenticate(first_name = first_name, last_name = last_name) 

永遠是無(?)。

但是,主要的問題是您沒有爲新用戶設置用戶名,只有first_name和last_name。這將只工作一次,但在創建一個用戶名爲空的用戶後,下一次嘗試將失敗,因爲用戶需要一個唯一的用戶名。 因此:添加用戶名!

除此之外,我認爲

user = facebook_user.save() 

不將用戶分配到「用戶」,但形式。 你應該使用facebook_user.instance。