2015-11-25 3 views
0

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

У меня есть User:

# models.py 
class User(AbstractBaseUser): 
    email = models.EmailField(unique=True) 

И я начал в форме:

# forms.py 
class ChangeAccountDetailsForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ('email',) 

    current_password = forms.CharField(widget=forms.PasswordInput) 
    password = forms.CharField(widget=forms.PasswordInput) 
    confirm_password = forms.CharField(widget=forms.PasswordInput) 

Я создал простой вид, что работает только с запросом GET в минуту:

# views.py 
def edit_account_details(request): 
    if request.method == 'GET': 
     account_form = ChangeAccountDetailsForm() 
     return render(request, 'freelancestudent/edit_account_details.html', { 
      {'form': account_form} 
     }) 
    else: 
     pass 

И простой HTML-файл, который просто вызывает {{form.as_p}}. Когда я запускаю его, как есть, я получаю ошибку unhashable type: 'dict' по адресу {'form': account_form}. Как я могу отобразить электронную почту текущего пользователя и предоставить функции для изменения пароля. Возможно ли это с ModelForm, или мне придется сворачивать свою собственную форму и самостоятельно выполнять всю логику?

+2

Обратите внимание, что ваша проблема не совсем связана с того, что делает форму; но также обратите внимание, что в основе auth framework Django входят [views] (https://docs.djangoproject.com/en/1.8/topics/auth/default/#module-django.contrib.auth.views) и [forms] (https: //docs.djangoproject.com/en/1.8/topics/auth/default/#module-django.contrib.auth.forms), которые выполняют именно это. –

ответ

1

Здесь:

return render(
    request, 
    'freelancestudent/edit_account_details.html', { 
      {'form': account_form} 
     }) 

У вас есть два набора {}. Внутренний один определяет dict, внешний один определяет set, так что это эквивалентно:

context = {'form': account_form} 
whatever = set(context) 

Теперь sets нужны их ценности, чтобы быть hashable (так же, как dict ключей), а dict не hashable, следовательно, ваш сообщение об ошибке.

Но в любом случае: render ожидает dict, не set, так что вы хотите:

return render(
    request, 
    'freelancestudent/edit_account_details.html', 
    {'form': account_form} 
) 
Смежные вопросы