【问题标题】:csrfmiddlewaretoken error while creating form using cripsy-forms使用 cripsy-forms 创建表单时出现 csrfmiddlewaretoken 错误
【发布时间】:2015-01-02 22:05:07
【问题描述】:

我是 django 的初学者(使用 django 1.7)并尝试使用 Krispy-forms 创建一个表单,以便将新产品添加到 db。问题是,表单正在工作,但它没有在数据库中创建新产品。

当我登录时,如果我点击保存按钮没有任何反应,并在地址栏中显示如下。

http://127.0.0.1:8000/add_product/?csrfmiddlewaretoken=kfGpEA6ZC32Lad9m9uwWZEhElwBGLHPA&csrfmiddlewaretoken=kfGpEA6ZC32Lad9m9uwWZEhElwBGLHPA&Category_IDCategory=66&DealType=Rent&Title=kkjkj&Price=78&Description=kjjk&save=Save

如果我退出并单击保存按钮,它会将我定向到我在表单中提供的主页,但数据库中仍然没有新产品。

问题看起来与用户和csrf有关,但即使我搜索了也无法弄清楚确切的问题需要您的帮助。

models.py

class Product(models.Model):
 DealType_Choice = (
    ("Sale", "Sale"),
    ("Rent", "Rent"),
    ("Swap", "Swap"),
    ("Free", "Free"),
    ("Announ", "Announ"),

)
 DealType = models.CharField(max_length=11, blank=True, choices=DealType_Choice)
 Title = models.CharField(max_length=70)
 Description = models.TextField(blank=False)
 Price = models.IntegerField(max_length=11, null=True)
 User_IDUser = models.ForeignKey(User)
 Category_IDCategory = models.ForeignKey(Category)
 PubDate = models.DateField("Publication Data")

 def __str__(self):
     return self.Title

views.py

def add_product(request):
   product_form= ProductForm(request.POST)
   if product_form.is_valid():
       form=product_form.save(commit=False)
       form.User_IDUser= request.user
       form.save()
       return HttpResponseRedirect('/')
   else:
       product_form= ProductForm()
   return render(request, 'add_productts.html', {'product_form':product_form})

forms.py

class ProductForm(forms.ModelForm):
   Category_IDCategory=forms.ModelChoiceField(queryset=Category.objects.all(), label="Category")
   DealType=forms.ChoiceField(widget=forms.Select, choices=Product.DealType_Choice, label="DealType")
   Title=forms.CharField(label='Title', max_length=70)
   Price=forms.IntegerField(min_value=0, label='Price')
   Description=forms.CharField(widget=forms.Textarea(), label="Description")

def __init__(self, *args, **kwargs):
    self.helper = FormHelper()
    self.helper.form_method = "POST"
    self.helper.form_action= "/"
    self.helper.layout= Layout(
        Field('Category_IDCategory',css_class='input-sm'),
        Field('DealType',css_class='input-sm'),
        Field('Title',css_class='input-sm'),
        Field(PrependedText('Price', 'TL', '.00'),css_class='input-sm'),
        Field('Description',css_class='input-sm', rows=5),
        FormActions(
            Submit('save', 'Save', css_class='btn btn-labeled btn-info'))
    )
    super(ProductForm, self).__init__(*args, **kwargs)

class Meta:
    model=Product
    fields= ['Category_IDCategory','DealType', 'Title','Price', 'Description']

模板

{% extends "index.html" %}
{% load crispy_forms_tags %}
{% block content %}

    <h1>Add Product</h1>{% csrf_token %}
    {% crispy product_form %}


{% endblock %}

urls.py

urlpatterns = patterns('',
...
url(r'^add_product/$', add_product),
...

)

【问题讨论】:

  • 你是否也在settings.py中指定了CsrfMiddleware?
  • settings.py 将其命名为 'django.middleware.csrf.CsrfViewMiddleware',
  • 你能显示你的 urls.py 吗?
  • @torm 添加到帖子中。

标签: django django-templates django-views django-crispy-forms django-1.7


【解决方案1】:

我认为这是错误的:

self.helper.form_action= "/"

form_action应该是add_product函数:

self.helper.form_action= "/add_product/"

【讨论】:

  • 它指向127.0.0.1:8000/add_product/<url_to_add_product> 并且它不存在。
  • 您是否完全更改为self.helper.form_action= "/add_product/"(第一个/)?
  • 非常感谢!当我注销时,它说用户不能为NULL,我证明了特定的用户ID为“form.User_IDUser_id = 3”并且它有效!但登录后仍然无法正常工作。
  • 解决了登录用户问题。原来index.html中有一个未闭合的标签。希望对面临同样问题的其他人有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 2019-01-17
  • 2017-09-02
相关资源
最近更新 更多