Лучший способ зарегистрировать пользователя в Django
Я пытаюсь выполнить регистрацию пользователя для своего приложения 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()
Ясно ли, что я пытаюсь сделать? Я на правильном пути
Ответы
Ответ 1
Сделайте две формы модели: одну для модели 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>
Ответ 2
Я просто изучал это и выяснил, что 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