2016-03-25 23 views
0

DÜZENLEME: arka plan hikaye atlayıp sadece hata mesajını ve kodunu kontrol etmek isterseniz tüm alt :) Ben'Kullanıcı' nesne hiçbir özellik 'arka uç' vardır


de var dökümü ve yarım günlüğüne bir kullanıcı kayıt formu uygulamaya çalışıyorum ve hala çok yakınım ama henüz o kadar yakın olmadığımı hissediyorum.

Django'yu UserCreationForm'da yerleşik olarak uygulamaya başladım. Ve benim görünümü için ben bu question yanıt esinlenerek bu kod parçası cunstructed:

from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth import login 

def create_user(request): 
    if request.method == "POST": 
     form = UserCreationForm(request.POST) 
     if form.is_valid(): 
      new_user = User.objects.create_user(**form.cleaned_data) 
      login(new_user) 
      return redirect('post_list') 
    else: 
     form = UserCreationForm() 

    return render(request, 'blog/create_user.html', {'form': form}) 

Sorun oldu: Kullanıcıların yanı kendi e-posta saklamak mümkün istedi. Bu yüzden forms.py dosyada UserCreationForm() uzatmak için bu blog gelen kod parçası kullanmaya karar:

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 

class UserCreateForm(UserCreationForm): 
    email = forms.EmailField(required=True) 

    class Meta: 
     model = User 
     fields = ("username", "email", "password1", "password2") 

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

Ben gerçek bir web-sayfası işaretlendiğinde Hala e-posta kısmını dahil etmeme kararı (hatta ben anahtarlamalı sonra dışarı: from django.contrib.auth.forms import UserCreationForm ila from .forms import UserCreationForm). Son olarak, her iki views.py ve forms.py dosyalarında form. Yani forms.py dosyada şimdi ki: Bu question esinlenerek

class UserForm(UserCreationForm): 

Çözüm.

Yani şimdi 'password1' is an invalid keyword argument for this function dedi, "Tabii ki, formumdan bir sözlüğü create_user'a geçiriyorum ve şimdi UserCreationForm ile kurcalamıyorum artık sorunsuz şekilde çalışmıyor: create_user ?. bir kullanıcı adı, e-posta ve şifre doğru Ama şimdi adınızı, e-posta, password1 ve password2 yolluyorum Yani

ben views.py kodda aşağıdaki eklendi: Şimdi

if form.is_valid(): 
    username = form.cleaned_data["username"] 
    email = form.cleaned_data["email"] 
    password = form.cleaned_data["password1"] 
    new_user = User.objects.create_user(username, email, password) 
    login(new_user) 

Ben TypeError at /create_user/: login() takes exactly 2 arguments (1 given) almak ve viteslerimi gerçekten öğüten şey, bunun kurcalamadan önce nasıl bir sorun olmadığını UserCreationForm (hatırlamamın en iyisine). çoğu insan için yine bu yüzden benim kodunu değiştirmek login(request, user) ile giriş-işlevi çağırmak gibi Ama, tamam, ben, dokümantasyon ve bazı örneklerle okumak, onu google edeceğiz İyi görünüyor: Burada

new_user = User.objects.create_user(username, email, password) 
login(request, new_user) 

Ve ben m nihayet çıkmazda ben olsun:

'User' object has no attribute 'backend' 

bunu google ve ya benim durum ile ilişkilidir şey bulamazsanız ya da ben öyle görmek witted yavaş değilim. Orada yanlış olanı açıklayabilecek biri varsa, bunu çok takdir ederim. Geçerli kod

Kod dökümü:
atlanmış diğer görünümleri ve okunabilirlik

için ilgisiz ithalatı

views.py

from django.shortcuts import render 
from .forms import UserForm 
from django.shortcuts import redirect 
from django.contrib.auth.models import User 
from django.contrib.auth import login 

def create_user(request): 
    if request.method == "POST": 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data["username"] 
      email = form.cleaned_data["email"] 
      password = form.cleaned_data["password1"] 
      new_user = User.objects.create_user(username, email, password) 
      login(new_user) 
      return redirect('post_list') 
    else: 
     form = UserForm() 

    return render(request, 'blog/create_user.html', {'form': form}) 

formlar.docs itibaren py

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 

class UserForm(UserCreationForm): 
    email = forms.EmailField(required=True) 

    class Meta: 
     model = User 
     fields = ("username", "email", "password1", "password2") 

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

cevap

3

:

çağrılması kimlik doğrulaması() ilk el başarıyla authenticate ile kullanıcı doğrulaması gerekir bir kullanıcı giriş yapıyorsanız

() önce çağrı girişi(). authenticate() kimlik arka uç başarıyla ilgili kullanıcıyı (detaylar için arkauçlar belgelerine bakın) kimliği doğrulanmış belirterek Kullanıcı üzerinde bir öznitelik ayarlar ve bu bilgiler daha sonra giriş işlemi sırasında gereklidir. 'u denerseniz, veritabanından doğrudan alınan bir kullanıcı nesnesini girerseniz bir hata ortaya çıkar.

Yani, bir kullanıcı oturum için, önce authenticate() arayıp kullanıcı döndürülür olmadığını kontrol gerekir:

new_user = User.objects.create_user(username, email, password) 
new_user = authenticate(username=username, password=password) 
if new_user: 
    login(request, new_user) 
İlgili konular