2017-02-17 11 views
0

私はforms.pyで作成したフォームを使用してHTMLをレンダリングしようとしていますが、これは動作しません。また、コンソールにもメッセージはありませんので、これを修正するのは難しいです。見て、どの部分が間違っているか教えてください。Django:forms.pyのフォームはHTMLで表示されません

これはurls.py

url(r'^profile/(?P<username>[-\w.]+)/$', views.profile, name='profile'), 
url(r'^password_change/(?P<username>[-\w.]+)/$', views.password_change, name='password_change'), 
url(r'^password_change_done/$', views.password_change_done, name='password_change_done'), 

forms.py

class PasswordChangeForm(forms.Form): 
    oldpassword = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'your old Password', 'class' : 'span'})) 
    newpassword1 = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'New Password', 'class' : 'span'})) 
    newpassword2 = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'Confirm New Password', 'class' : 'span'})) 

    class Meta: 
     model = User 
     fields = ("username",) 
     field_classes = {'username': UsernameField} 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     if self._meta.model.USERNAME_FIELD in self.fields: 
      self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': True}) 

    def clean(self): 
     if 'newpassword1' in self.cleaned_data and 'newpassword2' in self.cleaned_data: 
      if self.cleaned_data['newpassword1'] != self.cleaned_data['newpassword2']: 
       raise forms.ValidationError(_("The two password fields did not match.")) 
      return self.cleaned_data 

    def save(self, commit=True): 
     user = super().save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

views.py

@login_required 
def password_change(request, username): 
if request.method == 'POST': 
    form = PasswordChangeForm(data=request.POST, user=request.user) 
    print("username is "+username) 

    if form.is_valid(): 
     #form.save() 
     update_session_auth_hash(request, form.user) 
     form.save() 
     print("A") 
     return HttpResponseRedirect('/blog/password_change_done/') 
    else: 
     update_session_auth_hash(request, form.user) 
     form.save() 
     print("B") 
     return redirect(reverse('blog:profile', args=[form.user.get_username()])) 
else: 
    print("C") 
    form = PasswordChangeForm(user=request.user)#unbound 
    return redirect(reverse('blog:profile', args=[form.user.get_username()])) 

profile.html(password_changeがロードされなければならない。)

あります
<h2>password change</h2> 
{% if error_message %} 
<p><strong>{{ error_message }}</strong></p> 
{% else %} 
{% endif %} 
<form class="form-horizontal" role="form" action="{% url 'blog:password_change' user.username %}" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" class="button-primary">password change</button></div> 
</form> 
ここ
+0

あなたはページの残りの部分をすべて見ることができますか?このフォームだけがロードされていませんか? –

+0

@AlexanderTyapkovの残りの部分は正しく読み込まれていますが、それは他の部分がHTMLで構築されているからです。このフォームのみが読み込まれません。 – camila

+0

あなたはテンプレートにフォームを提供していません。 –

答えて

0

from django.contrib import messages 
from django.contrib.auth import update_session_auth_hash 
from django.contrib.auth.forms import PasswordChangeForm 
from django.shortcuts import render, redirect 

def change_password(request): 
    if request.method == 'POST': 
     form = PasswordChangeForm(request.user, request.POST) 
     if form.is_valid(): 
      user = form.save() 
      update_session_auth_hash(request, user) # Important! 
      messages.success(request, 'Your password was successfully updated!') 
      return redirect('accounts:change_password') 
     else: 
      messages.error(request, 'Please correct the error below.') 
    else: 
     form = PasswordChangeForm(request.user) 
    return render(request, 'accounts/change_password.html', { 
     'form': form 
    }) 

を実装する方法をCHANGE_PASSWORDビューの例の一つがGET要求に関連する部分を見てくださいています。フォームを作成し、コンテキストでページをレンダリングする必要があります。コンテキストにフォームを提供する必要があります。

あなたの場合は、フォームを作成して、その直後にプロファイルページにリダイレクトします。そのため、空のフォームページが表示されます。

+0

このpassword_changeフォームは、プロファイルurlになければなりません。私は1つのhtmlで2つのフォームをロードしようとしています。それは不可能ですか? – camila

+0

@camilaそれは可能ですが、あなたはテンプレートにフォームを提供していません。私が提供したコードの最後の行を見てください。そこに私はchange_password.htmlに与えられたフォームを持っています –

関連する問題