【问题标题】:how to remove the tips?如何删除提示?
【发布时间】:2014-05-02 12:30:06
【问题描述】:

请帮助解决问题。

我做了一个页面,里面有密码修改的表格。但在首次启动时(在用户将数据输入表单之前)提示“是必填字段”。

仅当用户错误地提交了完整的表单时,我才需要显示这些提示。

urls.py:

urlpatterns = patterns('drummersaransk',
    url(r'^$', 'views.page'),
    url(r'^userprofile/password_page/', 'views.password_page'),     
    url(r'^userprofile/password_page_changed/', 'views.password_page_changed'),     
    url(r'^admin/', include(admin.site.urls)),
)

views.py:

@login_required 
def password_page(request):     
    if request.method == 'POST':                                
        form = ChangePasswordForm(request.POST, request=request)
        if form.is_valid():
            username = User.objects.get(username__exact=request.user.username)
            username.set_password(form.cleaned_data.get('password1'))
            username.save() 
            return HttpResponseRedirect('/userprofile/password_page_changed/')                      
    else:                       
        form = ChangePasswordForm(request.POST or None, request=request)

    t = loader.get_template('password_page.html')
    c = RequestContext(request, {
                                    'form': form,
    }, [custom_proc])   

    return HttpResponse(t.render(c)) 

password_page.html:

{% extends "page_base.html" %}

{% block title %}User profile - pass{% endblock %}

{% block content %}
    <h2>pass page</h2>

    {% for field in form %}
        {{ field.error }}
    {% endfor %}    

    <form action="/userprofile/password_page/" method="POST">{% csrf_token %}
        {{ form.as_p }}

        <input type="submit" value="send" />
    </form>

{% 端块 %}

forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django.forms import ModelForm

from drummersaransk.models import UserProfile


class ChangePasswordForm(forms.Form):
    password_old = forms.CharField(max_length=30, widget=forms.PasswordInput())
    password1 = forms.CharField(widget=forms.PasswordInput())
    password2 = forms.CharField(widget=forms.PasswordInput())

    def __init__(self, post, request, *args, **kwargs):
        self.post = post
        self.request = request
        super(ChangePasswordForm, self).__init__(post, request, *args, **kwargs)        

    def clean_password_old(self):
        cleaned_data = self.cleaned_data
        password_old = cleaned_data.get("password_old") 
        if not self.request.user.check_password(password_old):
            raise forms.ValidationError("old Password is not correct")
        else:
            return password_old

    def clean(self):    
        cleaned_data = self.cleaned_data
        password1 = cleaned_data.get("password1")
        password2 = cleaned_data.get("password2")   

        if password1 != password2:      
            raise forms.ValidationError("Passwords must be same")
        else:                           
            return cleaned_data

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果它不是 POST,则不应将位置参数中的任何内容传递给表单。

    form = ChangePasswordForm(request=request)
    

    编辑

    正如我所说,您在 ChangePasswordForm 的定义中做了一些奇怪的事情。您同时接受 postrequest 参数 - 即使您实际上根本没有使用 post - 更糟糕的是,您将它们传递给超类的 __init__ 方法,即使它不是期待他们。

    这样做的方法是只接受request,但要在 kwargs 中这样做。这样,您无需更改函数签名,您可以选择是否将其传递给超类。

    class ChangePasswordForm(forms.Form):
        def __init__(self, *args, **kwargs):
            self.request = kwargs.pop('request', None)
            super(ChangePasswordForm, self).__init__(*args, **kwargs)
    

    【讨论】:

    • 异常值:__init__() 缺少 1 个必需的位置参数:'post' 异常位置:c:\Python33\django_projects\drummersaransk\drummersaransk\views.py in password_page,第 140 行
    • 所以看起来你在该表单的定义中做了一些有点奇怪的事情。您应该发布该代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2020-09-25
    相关资源
    最近更新 更多