【问题标题】:Django: is there a generic handler to insert a POST object directly into the database?Django:是否有通用处理程序将 POST 对象直接插入数据库?
【发布时间】:2012-01-31 02:53:40
【问题描述】:

Django:是否有一个通用处理程序可以将 POST 对象直接插入数据库?我发现自己编写了很多看起来像这样的处理程序。

def ajax_storeObject(request):
    if request.method == 'POST':
         Object(
                field1 = request.POST["field1"],
                field2 = request.POST["field2"],
                field3 = request.POST["field3"],
                field4 = request.POST["field4"],
          ).save()
          return HttpResponse(json.dumps({"status":"Success"}), mimetype="application/json")
    return HttpResponse(json.dumps({"status":"Failed"}), mimetype="application/json")

似乎可以有一个单一的通用视图来处理这种事情。这样的观点存在吗?

编辑:顺便说一句,我对模型表单很满意,但我在这里看到的用例更窄:不基于标准表单的 RESTful AJAX 调用(例如,用户操作页面上的对象,并发送 REST 调用通知服务器。)。

【问题讨论】:

标签: ajax django rest django-generic-views


【解决方案1】:

没有什么需要你实际绘制表格的表格。如果您不打算使用活塞或美味派或类似的东西,那么使用 ModelForms 是正确的选择。

把这个放在你的页面中: https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

class ObjectAjaxForm(forms.ModelForm):
  class Meta:
     model = Object
     fields = ("field1", "field2", "field3", "field4")


#or, if you don't want the "free" csrf protection
#@csrf_exempt
def ajax_store_object(request):
    #request.POST can be substituted with any dictionary/dictionary like object
    form = ObjectAjaxForm(request.POST)
    if form.is_valid():
      form.save()
      return HttpResponse(json.dumps({"status":"Success"}), mimetype="application/json")
    else:
      return HttpResponse(json.dumps({"status":"Failed"}), mimetype="application/json")

【讨论】:

    【解决方案2】:

    据我所知,没有通用的 Ajax 视图,但也许您正在寻找这个?

    Object(**request.POST).create()
    

    当然,您需要确保request.POST 不包含您不想放入模型中的任何内容(例如“提交”字段)。

    【讨论】:

    • 我明白了为什么 modelForms 在这里工作,但出于好奇,这有什么问题?
    • 如果我知道你正在这样做,我可以轻松构建一个恶意表单,其中包含 id="abcdsef" 或 id=999999999999999999999999999999999999999999999999999999999999999999999999。或者,如果您稍后在模型中添加非公共字段(即 _reputation_sum),恶意行为者可能会给自己带来无限的声誉。如果您有外键,我可以通过覆盖 user_id 向您的所有用户发送垃圾邮件。这只是我可以在五分钟内想出的潜在漏洞。显式优于隐式。
    【解决方案3】:

    你看过model forms吗?

    【讨论】:

    • 啊,好点子。我了解模型形式。我在这里看到的用例更窄:不基于标准表单的 RESTful AJAX 调用(例如,用户操作页面上的对象,并发送 REST 调用以通知服务器。)。我已编辑问题以反映此范围。
    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2012-08-08
    • 2011-02-19
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多