Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改电子邮件时禁止使用python Django 403_Python_Django_Csrf - Fatal编程技术网

更改电子邮件时禁止使用python Django 403

更改电子邮件时禁止使用python Django 403,python,django,csrf,Python,Django,Csrf,我想使用标准的Django方法更改用户电子邮件,但在更改电子邮件之前,表单和数据库中的密码必须匹配。而我;我收到403错误,CSRF令牌丢失或不正确。这是我的表格: class ChangeMailForm(forms.Form): password = forms.CharField(label = (u'Podaj hasło'), widget=forms.PasswordInput(render_value=False)) email = forms.EmailField

我想使用标准的Django方法更改用户电子邮件,但在更改电子邮件之前,表单和数据库中的密码必须匹配。而我;我收到403错误,CSRF令牌丢失或不正确。这是我的
表格

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
我的
视图

def ChangeEmail(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/')
    if request.method == 'POST':
        form = ChangeMailForm(request.POST)
        if form.is_valid():
            usr = request.user
            u = User.objects.filter(username=usr)
            if not User.objects.filter(username=usr).check_password(form.cleaned_data['password']):
                return HttpResponseRedirect('/')
            mail = form.cleaned_data['email']
            u.new_email(mail)
            u.save()
        else:
            return render_to_response('changeemail.html', {'form':form},context_instance=RequestContext(request))
    else:
        form = ChangeMailForm()
        return render_to_response('changeemail.html', {'form':form}, context_instance=RequestContext(request))
以及我的
模板的一部分


{%csrf_令牌%}
{%if form.errors%}

Popraw następujące pola:

{%endif%} 波达伊有: {{form.password}} Podaj nowy地址: {{form.email}
任何帮助都将不胜感激

编辑:在放置@csrf\u豁免装饰器后添加回溯

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/changeemail/
异常值:“QuerySet”对象没有属性“check_password”

您需要将此行更改为:

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

u = User.objects.filter(username=usr).first()
if u and u.check_password(...):
    ...
它为什么会在第一种方法中抛出错误,是因为
u
列表中的查询集,而该列表本身没有
check\u password
方法。但是您可以使用
queryset().first()
或将其切片
u[0]
来访问用户对象,并获取用户对象(当然,您需要验证该对象是否存在,否则它将是[])

请确保您的请求中确实存在
csrf\u令牌
,您可以使用日志记录并进行如下检查:

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

就是这样。

当前代码发生了什么变化?快速假设-如果不是User.objects.filter(email=email.exists()@IanPrice,我已经添加了我发布的原因(第二行),我无法更改您建议的行-如果电子邮件在DB中,它将返回ValidationError“此电子邮件在DB中”@AdamP,这一行是错误的:
User.objects.filter(username=usr)。check\u password(…)
u
是一个查询集,它本身没有
check\u password
方法。您需要更改为类似于
queryset().first()
u[0]
的内容来访问
User
对象(当然,您需要验证该对象是否存在,否则它将是
[]
)。尽管我上面提到的是正确的,
CSRF
缺少代码中其他地方的错误提示,没有正确地传递/验证它。@AdamP,你能试着在你的视图中放置一个
@csrf\u export
装饰器来检查其他部件是否工作吗?请发布完整的traceOk,但请告诉我如何更新
电子邮件
字段?我尝试了
u.update(email=request.POST['email'])
u.update(email=mail)
,但它返回的结果是用户没有
update
属性。使用
u.email(mail)
我得到
unicode不可调用
。我已经登录到我的视图中,但没有看到任何信息。@AdamP,这只是普通的django model save()方法??好的,我会为你更新答案哇,这比我想象的要容易。谢谢你的帮助。@AdamP,没问题;)是的,实际上修改/更新模型比我们以前想象的要容易得多。