我一直在尝试使用form.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 userviews.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>I've been trying to render HTML using form I made in forms.py, however this is not working, just fail to loaded without error message. Also, there is no message in console too, so I'm having hard time to fix this. Please take a look and tell me which part is wrong.
This is 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 userviews.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 (where password_change should be loaded.)
<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>最满意答案
以下是如何实现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请求有关的部分。 您必须创建表单并使用上下文呈现页面。 您应该为上下文提供表单。
在你的情况下,你创建表单并在那之后直接重定向到配置文件页面。 这就是为什么你看到空的表单页面。
Here is one of the examples how change_password view can be implemented
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 })Have a look at the part related to GET request. There you have to create the form and render the page with context. You should provide form to the context.
In your case you create the form and redirect to the profile page straight after that. That is why you see empty form page.
更多推荐
发布评论