更改emai时禁止使用python Django 403

2024-09-24 22:22:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用标准的Django方法更改用户电子邮件,但是在更改电子邮件之前,表单和数据库中的密码必须匹配。我得到了403错误CSRF token missing or incorrect.这是我的form

class ChangeMailForm(forms.Form):
    password = forms.CharField(label = (u'Podaj hasło'), widget=forms.PasswordInput(render_value=False))
    email = forms.EmailField(label = (u'Podaj nowy adres email'))

    def clean_email(self):
        mail = self.cleaned_data['email']
        if User.objects.filter(email=email).exists():
            raise ValidationError("Taki email jest w bazie")
        return mail

我的view

^{pr2}$

以及我的template的一部分:

<form action="" method="post">
    {% csrf_token %}
    {% if form.errors %}<p id="correct">Popraw następujące pola:</p>{% endif %}
    <table id="change">
        <tr>
            <td {% if form.password.errors %} class="error" {% endif %}>Podaj hasło:</td>
            <td>{{ form.password }}</td>
        </tr>
        <tr>
            <td {% if form.email.errors %} class="error" {% endif %}>Podaj nowy adres:</td>
            <td>{{ form.email }}</td>
        </tr>
    </table>
    <div id="sub">
    <input type="submit"  value="Wykonaj" alt="login" id="submit" />

任何帮助将不胜感激。在

编辑:在放置@csrf_exempt decorator后添加回溯

Request Method: POST
Request URL: http://127.0.0.1:8000/changeemail/

Django Version: 1.7.1
Python Version: 2.7.8
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'dailyresults',
 'trainingresults',
 'athlete',
 'easy_pdf')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:
File "D:\Programy\Python27\lib\site-packages\django-1.7.1-py2.7.egg\django\core\handlers\base.py" in get_response
  111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Programy\Python27\lib\site-packages\django-1.7.1-py2.7.egg\django\views\decorators\csrf.py" in wrapped_view
  57.         return view_func(*args, **kwargs)
File "D:\Inz\trening\athlete\views.py" in ChangeEmail
  93.             if not User    .objects.filter(username=usr).check_password(form.cleaned_data['password']):

异常类型:AttributeError at/changemail/ 异常值:“QuerySet”对象没有“check\u password”属性


Tags: djangoformviewidifemailformspassword
1条回答
网友
1楼 · 发布于 2024-09-24 22:22:51

您需要从以下位置更改此行:

u = User.objects.filter(username=usr)
if not User.objects.filter(username=usr).check_password(...):

为此:

^{pr2}$

为什么在第一种方法中抛出错误是因为u列表中的一个查询集,它本身没有check_password方法。但是您可以使用queryset().first()或将其切片u[0]访问用户对象,并获得用户对象(当然,您需要验证是否存在,否则它将是[])。在

并且请确保csrf_token确实存在于您的请求中,您可以使用日志记录并检查如下内容:

import logging
...
#your view
logging.info('request MEAT for csrf: %s', request.META.get('CSRF_COOKIE'))

看看它是否存在。在

此外,您可以尝试清除浏览器缓存,或使用另一个浏览器(新会话或专用会话)进行测试,看看是否仍发生错误。在

更新

当您需要更新电子邮件字段时,只需使用普通模型保存方法:

# above code... and being verified ...
u.email = form.cleaned_data['email']
u.save()

就这样。在

相关问题 更多 >