如何在django中保存POST数据?

时间:2014-03-25 05:21:18

标签: python django

这是一个例子: 形式有三个字段,即

from django import forms
from models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ('title','body','thumbnail') 

查看

from django.shortcuts import render_to_response
from uploadfiles.models import Article
from django.http import HttpResponse, HttpResponseRedirect
from forms import ArticleForm
from django.core.context_processors import csrf

def create (request):
    if request.POST:
        form = ArticleForm(request.POST, request.FILES)
        if form.is_valid():
            return HttpResponseRedirect('/all')
    else:
        form = ArticleForm()
    args= {}
    args.update(csrf(request))
    args['form'] = form
    return render_to_response('create_article.html', args)

模型

from django.db import models
from time import time
def get_upload_file_name(request):
    return "uploaded_files/%s_%s" %(str(time()).replace('.','-'))


class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    thumbnail = models.FileField(upload_to = get_upload_file_name)
    def __unicode__(self):
        return self.title

html页面

<!DOCTYPE html>

<html>
<head>
    <title>Page Title</title>
</head>

<body>

<form action="/create" method="post" enctype="multipart/form-data">{% csrf_token %}
{{form.as_ul}}
<input type="submit" name="submit" value="create"/>
</form>

</body>
</html>

我的问题是:

1)什么是Meta类,为什么我们使用它?

2)这一行的含义是args.update(csrf(request))

3)在表单页面重定向到/create ..因为这可以是任何页面!那么现在如何保存发布的数据。因为这会将提交的数据返回到html页面。

我的问题可以是如此基本或简单,但这些是我不清楚的事情,因此我在这里张贴这个!并且它可以重复,所以如果你不喜欢它,请不要标记负面。:)

2 个答案:

答案 0 :(得分:1)

1)Meta =类元数据。您可以在此处定义模型的不同元数据元素

2)CSRF =这是防止跨站点攻击的令牌。这是一个隐藏的字段/属性,会添加到您的请求中,以确保有人无法破解您的网站

3)提交的数据会转到视图,您可以在那里保存数据。或者我误解了你的问题......

答案 1 :(得分:1)

1) 元类是一个&#39;&#39;这会创建类。

您可以定义类以创建对象,对吗?

但我们了解到Python类是对象。

嗯,元类就是创建这些对象的东西。他们是班级&#39;课程,你可以用这种方式画出来:

MyClass = MetaClass()
MyObject = MyClass()

您已经看到该类型可以让您执行以下操作:

MyClass = type('MyClass', (), {})

因为函数类型实际上是一个元类。 type是Python用于在幕后创建所有类的元类。

现在你想知道为什么它是用小写写的,而不是Type?

嗯,我想这是与str的一致性问题,创建字符串对象的类,以及创建整数对象的类。 type只是创建类对象的类。

获取更多帮助,请参阅此MetaClasses


2) 跨站点请求伪造(CSRF)

跨站点请求伪造漏洞是指恶意站点可能导致访问者的浏览器向服务器发出导致服务器更改的请求。服务器认为,因为请求附带了用户的cookie,所以用户想要提交该表单。

根据您网站上的哪些表单容易受到攻击,攻击者可能会对您的受害者执行以下操作:

  • 将受害者退出您的网站。 (在某些网站上,&#34;退出&#34;是一个链接 而不是一个按钮!)
  • 使用受害者的登录信息在您的网站上发表评论。
  • 将资金转移到其他用户的帐户。

为了防止这种情况,我们使用此update(csrf(request))

有关详细信息,请参阅此ABOUT CSRF和此CSRF django


3) /create是您当前控制器的一个动作,如果您在那里看到您的控制器页面,您可以在该功能中看到此创建功能,您将获得您的POST数据