要添加到数据库的Python Django表单
我正在尝试使用此表单添加到数据库中的表中。我目前收到错误“CSRF验证失败。请求中止。”但我收到其他错误,对此代码进行了不同的调整。我如何让这段代码起作用?编写这样的表单的最佳实践是什么 型号.py要添加到数据库的Python Django表单,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我正在尝试使用此表单添加到数据库中的表中。我目前收到错误“CSRF验证失败。请求中止。”但我收到其他错误,对此代码进行了不同的调整。我如何让这段代码起作用?编写这样的表单的最佳实践是什么 型号.py from django.db import models from django.contrib.auth.models import User class Portfolio(models.Model): user = models.ForeignKey(User) name =
from django.db import models
from django.contrib.auth.models import User
class Portfolio(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=30)
description = models.CharField(max_length=100)
def __unicode__(self):
return self.name
from django import forms
class CreatePortfolio(forms.Form):
name = forms.CharField(max_length=30)
description = forms.CharField(max_length=100)
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from portfolio.models import Portfolio
from portfolio.forms import CreatePortfolio
def portfolio(request):
if request.method == 'POST':
portfolio_form = CreatePortfolio(request.POST)
if form.is_valid():
csrf_token = django.middleware.csrf.get_token(request)
port_name = form.cleaned_data['name']
port_description = form.cleaned_data['description']
port_user = request.user
new_portfolio = Portfolio(name=port_name, description=port_description, user=port_user)
new_portfolio.save()
return render_to_response('portfolio.html', {'csrf_token': csrf_token})
else:
portfolio_form = CreatePortfolio()
return render_to_response('portfolio.html', {'portfolio_form': portfolio_form})
forms.py
from django.db import models
from django.contrib.auth.models import User
class Portfolio(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=30)
description = models.CharField(max_length=100)
def __unicode__(self):
return self.name
from django import forms
class CreatePortfolio(forms.Form):
name = forms.CharField(max_length=30)
description = forms.CharField(max_length=100)
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from portfolio.models import Portfolio
from portfolio.forms import CreatePortfolio
def portfolio(request):
if request.method == 'POST':
portfolio_form = CreatePortfolio(request.POST)
if form.is_valid():
csrf_token = django.middleware.csrf.get_token(request)
port_name = form.cleaned_data['name']
port_description = form.cleaned_data['description']
port_user = request.user
new_portfolio = Portfolio(name=port_name, description=port_description, user=port_user)
new_portfolio.save()
return render_to_response('portfolio.html', {'csrf_token': csrf_token})
else:
portfolio_form = CreatePortfolio()
return render_to_response('portfolio.html', {'portfolio_form': portfolio_form})
视图.py
from django.db import models
from django.contrib.auth.models import User
class Portfolio(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=30)
description = models.CharField(max_length=100)
def __unicode__(self):
return self.name
from django import forms
class CreatePortfolio(forms.Form):
name = forms.CharField(max_length=30)
description = forms.CharField(max_length=100)
from django.http import HttpResponse
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.core.context_processors import csrf
from portfolio.models import Portfolio
from portfolio.forms import CreatePortfolio
def portfolio(request):
if request.method == 'POST':
portfolio_form = CreatePortfolio(request.POST)
if form.is_valid():
csrf_token = django.middleware.csrf.get_token(request)
port_name = form.cleaned_data['name']
port_description = form.cleaned_data['description']
port_user = request.user
new_portfolio = Portfolio(name=port_name, description=port_description, user=port_user)
new_portfolio.save()
return render_to_response('portfolio.html', {'csrf_token': csrf_token})
else:
portfolio_form = CreatePortfolio()
return render_to_response('portfolio.html', {'portfolio_form': portfolio_form})
portfolio.html
<form method="post" action="">
{% csrf_token %}
<div class="field">
<label for="id_name">Name:</label>
{{ portfolio_form.name}}
</div>
<div class="field">
<label for="id_description">Description:</label>
{{ portfolio_form.description }}
</div>
<input type="submit" value="Create">
</form>
{%csrf_令牌%}
姓名:
{{portfolio_form.name}
说明:
{{portfolio_form.description}}
您不必显式发送csrf\u令牌。Django会帮你处理的
每次提交表单时,它都会验证令牌,并为后续请求生成新令牌。在这里,您强制它使用相同的令牌,因此出现了错误
您的视图应该如下所示:
def portfolio(request):
if request.method == 'POST':
portfolio_form = CreatePortfolio(request.POST)
if form.is_valid():
port_name = form.cleaned_data['name']
port_description = form.cleaned_data['description']
port_user = request.user
new_portfolio = Portfolio(name=port_name, description=port_description, user=port_user)
new_portfolio.save()
return render_to_response('portfolio.html', {}, context_instance=RequestContext(request))
else:
portfolio_form = CreatePortfolio()
return render_to_response('portfolio.html', {'portfolio_form': portfolio_form}, context_instance=RequestContext(request))
问题是您没有在render\u to\u响应中将csrf令牌添加到上下文中 使用RequestContext呈现您的视图(在其上下文中自动包含csrf),如下所示: 或手动更新csrf,如下所示:
from django.core.context_processors import csrf
from django.shortcuts import render_to_response
def portfolio(request):
# ... view code here
c = {'portfolio_form': portfolio_form}
c.update(csrf(request))
return render_to_response("portfolio.html", c)
更多参考请参见此处