2010-08-19 4 views
33

Я пытаюсь внедрить регистрацию пользователей для своего приложения Django. В книге, которую я прочитал, упоминается UserCreationForm, но мне нужно больше, чем просто имя, пароль и адрес электронной почты. Я мог бы реализовать свой собственный пользовательский объект и использовать ModelForm, я думаю, но потом я теряю часть удобств django для аутентификации. Наконец, я прочитал кое-что о UserProfiles, которые дополняют пользователей, я думаю, поэтому я думаю, что мне нужна комбинация из всех этих вещей. Вот что я до сих пор.Лучший способ зарегистрировать пользователя в Django

Вид - это достаточно просто. Все, что я хочу сделать здесь создать свою форму и сохранить пользователю

def main(request): 
    rform1 = forms.RegisterForm1() 
    rform2 = forms.RegisterForm2() 
    return render_to_response("authentication/index.html", {'form1': rform1, 'form2':rform2}) 

def register(request): 
    if request.method == 'POST': 
     rform1 = forms.RegisterForm1(request.POST) 
     rform2 = forms.RegisterForm2(request.POST) 
     if rform1.is_valid() and rform2.is_valid(): 
      new_user = rform1.save() 
      return HttpResponseRedirect("/register-success/") 
    return render_to_response("authentication/index.html", {'form1': rform1,'form2':rform2}) 

формы - это моя форма для создания пользователя. Или его начало как минимум

class RegisterForm1(forms.ModelForm): 
    class Meta: 
     model = User 

class RegisterForm2(forms.ModelForm): 
    class Meta: 
     model = UserProfile 

Модель - это мой UserProfile, который я хочу дополнить Пользователем.

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    phonenumber = PhoneNumberField() 

Понятно, что я пытаюсь сделать? Я на правильном пути

ответ

29

пасов две типовых форм, один для User модели и один для UserProfile модели.

class UserForm(django.forms.ModelForm): 
    class Meta: 
     model = User 

class UserProfileForm(django.forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     exclude = ['user'] 

Дайте им префиксы и покажите их вместе в том же элементе HTML-формы. В представлении убедитесь, что оба значения действительны до сохранения пользователя, а затем UserProfile.

def register(request): 
    if request.method == 'POST': 
     uf = UserForm(request.POST, prefix='user') 
     upf = UserProfileForm(request.POST, prefix='userprofile') 
     if uf.is_valid() * upf.is_valid(): 
      user = uf.save() 
      userprofile = upf.save(commit=False) 
      userprofile.user = user 
      userprofile.save() 
      return django.http.HttpResponseRedirect(…something…) 
    else: 
     uf = UserForm(prefix='user') 
     upf = UserProfileForm(prefix='userprofile') 
    return django.shortcuts.render_to_response('register.html', 
               dict(userform=uf, 
                userprofileform=upf), 
               context_instance=django.template.RequestContext(request)) 

В register.html:

<form method="POST" action=""> 
    {% csrf_token %} 
    {{userform}} 
    {{userprofileform}} 
    <input type="submit"> 
</form> 
+0

отредактированные мой код. Кажется, я приближаюсь. Благодаря! – JPC

22

Я просто смотрел на это, и выяснили, что Django имеет очень простой встроенный в новую форму создания пользователя, который можно использовать, если вы хотите простую регистрацию - нет возможности, например, сохранить адрес электронной почты и проверить его, поэтому он не будет работать для использования в OP, но я отправляю его здесь, если другие сталкиваются с этим вопросом, как я, и что-то ищут просто.

Если вы просто хотите, чтобы люди могли выбрать имя пользователя и пароль, а затем встроенные модули будут делать все для вас, включая проверку и сохранение нового пользователя:

from django.views.generic.edit import CreateView 
from django.contrib.auth.forms import UserCreationForm 

urlpatterns = patterns('', 
    url('^register/', CreateView.as_view(
      template_name='register.html', 
      form_class=UserCreationForm, 
      success_url='/' 
    )), 
    url('^accounts/', include('django.contrib.auth.urls')), 

    # rest of your URLs as normal 
) 

Так что единственный что вы должны сделать, это создать себе register.html ...

Подробнее здесь: http://www.obeythetestinggoat.com/using-the-built-in-views-and-forms-for-new-user-registration-in-django.html

+0

Любые ресурсы о том, как создать register.html? – Tunisia

+0

@Tunisia jsut создает шаблон и отображает на нем 'form', как и для примера формы входа в документы. –

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