2013-03-19 97 views
1

我想使用此窗體添加到數據庫中的表。我目前收到錯誤「CSRF驗證失敗,請求中止。」,但我通過對此代碼進行了不同的調整來獲取其他錯誤。我如何獲得此代碼的工作方式以及編寫此類表單的最佳做法是什麼?Python Django窗體添加到數據庫

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> 

回答

0

的問題是,你是不是添加CSRF令牌來選擇render_to_response在您的上下文。手動

from django.template import RequestContext 

def portfolio(request): 
    # ... view code here 
    return render_to_response("portfolio.html", {'portfolio_form': portfolio_form}, context_instance=RequestContext(request)) 

或更新CSRF像這樣:

要麼使用RequestContext的渲染你的視圖(自動包括在其範圍內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) 

在這裏看到更多的引用

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

1

您沒有明確發送csrf_token。 Django爲你照顧它。

每次提交表單時,它都會驗證令牌,併爲後續請求生成一個新令牌。在這裏,你迫使它使用相同的標記,因此錯誤。

您的視圖應該是這個樣子:

​​