Изменить электронную почту пользователя в Django без использования django-профилей
В моем приложении Django я бы хотел, чтобы пользователь мог изменить адрес электронной почты. Я видел решение Stackru, указывающее людям на django-профили. К сожалению, я не хочу использовать полноценный модуль профиля, чтобы выполнить крошечный подвиг изменения электронной почты пользователей. Кто-нибудь видел это реализовано где-нибудь. Процедура проверки адреса электронной почты путем отправки подтверждающего электронного письма является обязательной в этом сценарии.
Я потратил много времени, пытаясь найти решение, которое работает, но безрезультатно.
Приветствия.
3 ответа
Кажется, что кто-то написал свои собственные. Это позволяет пользователям изменять свои адреса электронной почты и отправляет письма с подтверждением.
Адрес электронной почты принадлежит модели пользователя, поэтому нет необходимости использовать профили, чтобы пользователи могли обновлять свою электронную почту. Создайте форму модели из пользовательской модели, в которой в качестве поля используется только электронная почта, затем предоставьте эту форму в своем представлении и обработайте ее. Что-то вроде:
class UserInfoForm(forms.ModelForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('email',)
def my_view(request):
if request.POST:
user_form = UserInfoForm(request.POST, instance=request.user)
if user_form.is_valid():
user_form.save()
return HttpResponseRedirect(reverse('form_success_screen'))
else:
user_form = UserInfoForm()
return render_to_response('my-template.html', {'user_form': user_form}, context_instance=RequestContext(request))
Обратите внимание, что если форма успешна, я возвращаю HttpResponseRedirect, чтобы отправить пользователя на другую страницу. В этом случае я ищу названный URL из моего файла URL.
Не совсем уверен, что это новое требование Django 1.4, но я попробовал предложение Тома:
class UserInfoForm(forms.ModelForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = ('email')
и получил ошибку поля. Вы должны иметь запятую после каждого поля (или вот что решило мою ошибку):
fields = ('email',)
исправил проблему