gpt4 book ai didi

添加到数据库的 Python Django 表单

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:19 25 4
gpt4 key购买 nike

我正在尝试使用此表单添加到数据库中的表。我目前收到错误“CSRF 验证失败。请求中止。”,但我通过对此代码的不同调整而收到其他错误。如何让这段代码发挥作用?编写这样的表单的最佳实践是什么?

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

forms.py

from django import forms

class CreatePortfolio(forms.Form):
name = forms.CharField(max_length=30)
description = forms.CharField(max_length=100)

views.py

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_token。 Django 会为你处理好这一切。

每次提交表单时,它都会验证 token ,并为后续请求生成新 token 。在这里,您强制它使用相同的 token ,因此会出现错误。

您的 View 应如下所示:

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

关于添加到数据库的 Python Django 表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15502579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com