Django使用者(Django频道)中的表单资料验证(相当于form.is_valid)

时间:2019-05-01 06:44:16

标签: python django django-forms django-channels

我正在从基于http的设置(Django表单,视图等)转移到使用Django Channels的websocket设置(原因不可避免)。在基于http的设置中,我使用模板中的表单(3个字段-名称,数字,城市)输入了一些数据:

<form id="EntryForm" method="POST">
      {% csrf_token %}
      <div class="form-group ">
        {{ form }}
      </div>
      <button type="submit">Submit</button>
</form>

由于此数据以前是作为Django表单提交的(已使用“类Meta:”映射到我的Django模型),因此我可以轻松地使用form.is_valid()方法在views.py中对其进行验证。表单数据中的每个字段都有某些条件,例如CharField(max_length)等,这些条件已在我的views.py中通过is_valid()方法进行了验证。

if request.method == 'POST':
    form = EntryForm(request.POST, instance=Entry(user=request.user))
    if form.is_valid():
        form.save()
        messages.success(request, f'Submission accepted.')
...

如上所示,该表单属于我的forms.py中的表单类“ EntryForm”,它映射到我的models.py中名为Entry的模型(其中包含名称,数字和城市)。 / p>

但是在Django Channels中,为了提交表单数据,因为我必须使用.preventDefault()脚本,然后将数据作为单独的字典发送给我的consumers.py,因此无法到达作为Django形式。这是我的脚本:

<script>
$(document).ready(function(){

    var form_data = $("#EntryForm")
    ...
    ...
    socket.onopen = function(e){
        form_data.submit(function(event){
            event.preventDefault()
            var form_entry = {
                "name": $("#id_name").val(),
                "number": $("#id_number").val(),
                "city": $("#id_city").val()
            }
            socket.send(JSON.stringify(form_entry))
            form_data[0].reset()
        })
    }

此form_entry数据进入我的consumers.py,但是由于它不再是Django表单对象,因此我无法使用.is_valid()方法来验证数据(CharField max_length等)。我需要先验证数据,然后才能在我的consumers.py

中对其进行处理。

官方文档未涵盖此内容,因为它使用的是聊天应用程序示例,该示例不需要任何此类验证。实际上,它甚至不使用Django表单。

我有2个问题:

  1. 我可以在我的consumers.py中实例化一个EntryForm对象,然后在其中使用.is_valid()方法吗?既然不是http请求,该怎么办?

  2. 如果没有,我如何还能验证form_entry数据以确保其符合模型字段的条件(DecimalField,CharField,max_length等)?

1 个答案:

答案 0 :(得分:0)

事实证明,这比我想象的要容易。不需要DRF或任何其他框架。

在我的使用者中,我使用来自前端的传入数据实例化了模型的一个对象(Entry),然后继续对其执行所需的操作。 Django自动检查数据是否符合我在模型字段中设置的条件(CharField,max_length等),并告诉用户是否有错误!非常令人印象深刻的是,即使没有表单,它也可以工作。为我节省了很多工作和时间。