2017-02-17 33 views
0

我一直在尝试使用form.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

下面是一个例子如何change_password视图可以实现

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

看一看到GET请求相关的部分。您必须创建表单并使用上下文呈现页面。您应该为上下文提供表单。

在你的情况下,你创建表单并直接重定向到配置文件页面。这就是为什么你看到空的表单页面。

+0

这个password_change表单应该在配置文件url中。我试图在一个HTML中加载两个表单。是不可能的? – camila

+0

@camila这是可能的,但你没有提供给模板的形式..看看我提供的代码的最后一行。在那里,我给了change_password.html一个表单 –