如何在django中保存POST数据?

0 投票
2 回答
2193 浏览
提问于 2025-04-17 23:46

这里有一个例子,包含了:一个有三个字段的表单

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

网页

<!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) 什么是元类,为什么我们要用它?

2) 这一行 args.update(csrf(request)) 是什么意思?

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

我的问题可能很基础或简单,但这些是我不太明白的地方,所以我在这里发帖!可能会有重复的问题,如果你不喜欢,请不要给我负面评价。:)

2 个回答

1

1) Meta = 类的元数据。这是你定义模型中不同元数据元素的地方。

2) CSRF = 这是一个防止跨站攻击的令牌。它是一个隐藏的字段/属性,会被添加到你的请求中,以确保没有人能黑进你的网站。

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

1

1) 元类是用来创建类的“东西”。

你定义类是为了创建对象,对吧?

但是我们知道,Python中的类本身也是对象。

那么,元类就是用来创建这些对象的。可以把它想象成“类的类”,你可以这样理解:

MyClass = MetaClass()
MyObject = MyClass()

你可能见过type这个东西,它可以让你做这样的事情:

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

这是因为type这个函数实际上就是一个元类。type是Python用来在后台创建所有类的元类。

现在你可能会想,为什么它是小写的,而不是Type呢?

我想这是为了和str(创建字符串对象的类)以及int(创建整数对象的类)保持一致。type就是创建类对象的类。

想了解更多,可以查看这个 元类


2) 跨站请求伪造(CSRF)

跨站请求伪造漏洞是指一个恶意网站可以让访问者的浏览器向你的服务器发送请求,从而导致服务器上的某些变化。服务器会认为,因为请求带有用户的cookie,所以用户想要提交这个表单。

根据你网站上哪些表单存在漏洞,攻击者可能会对受害者做以下事情:

  • 把受害者登出你的网站。(在某些网站上,“登出”是一个链接,而不是按钮!)
  • 用受害者的账号在你的网站上发布评论。
  • 把资金转移到其他用户的账户。

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

想了解更多信息,可以查看这个 关于CSRF 和这个 Django的CSRF


3) /create 是你当前控制器的一个动作,如果你看到控制器页面,你可以在那里面找到这个create函数,在这个函数里你会得到你的POST数据。

撰写回答