【问题标题】:Form bound, but has nothing in cleaned_data表单绑定,但 clean_data 中没有任何内容
【发布时间】:2016-08-23 19:14:34
【问题描述】:

我觉得这可能是我缺少的一些简单的东西,但是由于发布数据来自我的 Angular javascript 中的 AJAX 调用,我不能太确定。简而言之,我从 request.body 中的 AJAX 调用获取数据,我有一个函数来处理它并将其转换为查询字典以绑定到我的表单。它一直工作到这一点。根据form.is_valid,表单是有效的,我可以看到数据正在发布,但它的clean_data属性中没有任何内容。

def requestPost(request):
    querystring = urllib.urlencode(ast.literal_eval(request.body))
    postdata = QueryDict(query_string=querystring)

    return postdata

def send(request, thread_id):
    # """Send a message to the thread."""

    account = Account.objects.get(email=request.user.username)
    thread = Thread.objects.get(id=thread_id)

    if request.method == "POST":
        x = requestPost(request)
        form = NewChat(requestPost(request))

        if form.is_valid():
            cleaned_data = form.cleaned_data
            threadchat = ThreadChat.objects.create(text=cleaned_data['message'], account=account, thread=thread)

            broadcast(threadchat.id)

            context = {"threadchat": threadchat}
            return composeJsonResponse(200, "", context)

class NewChat(forms.Form):
    message = forms.Textarea()

【问题讨论】:

  • requestPost 函数的意义何在?为什么不直接访问 request.POST 呢?
  • 由于发布数据来自 Angular 作为 AJAX 调用,因此数据在请求的正文属性中作为字符串传入。所以我必须处理字符串,并将其转换为 QueryDict

标签: ajax django forms post


【解决方案1】:

forms.Textarea 不是一个字段,它是一个小部件。您的表单中没有实际字段,因此 cleaned_data 为空。

您应该在表单中使用forms.CharField;如果您需要将其显示为文本区域,您可以将其作为小部件参数传递:

class NewChat(forms.Form):
    message = forms.CharField(widget=forms.Textarea())

【讨论】:

  • 太棒了,它奏效了。总是把我救出来丹尼尔哈,谢谢!
猜你喜欢
  • 2011-01-05
  • 2018-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2011-06-11
相关资源
最近更新 更多