Лучший способ зарегистрировать пользователя в Django - PullRequest
37 голосов
/ 19 августа 2010

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

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

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()

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

Ответы [ 2 ]

31 голосов
/ 19 августа 2010

Создание двух моделей моделей, одна для модели User и одна для UserProfile модели.

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

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

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

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))

In register.html:

<form method="POST" action="">
    {% csrf_token %}
    {{userform}}
    {{userprofileform}}
    <input type="submit">
</form>
29 голосов
/ 09 июня 2013

Я только что изучил это и обнаружил, что в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...