Django:forms.py中的表单不会以HTML格式显示(Django : Form in forms.py does not displayed in HTML)

编程入门 行业动态 更新时间:2024-10-25 14:32:34
Django:forms.py中的表单不会以HTML格式显示(Django : Form in forms.py does not displayed in HTML)

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

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 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 (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.

更多推荐

本文发布于:2023-04-28 00:07:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1329201.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:表单   会以   格式   forms   py

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!