繁体   English   中英

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

[英]Form data validation (equivalent of form.is_valid) in a Django consumer (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的模型(包含名称,数字和城市等字段)。

但是在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等)。 我需要先验证数据,然后才能在consumer.py中处理它

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

我有两个问题:

  1. 我可以在consumer.py中实例化一个EntryForm对象,然后在那里使用.is_valid()方法吗? 我该怎么做,因为它不是一个http请求?

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

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

在我的消费者中,我使用来自前端的传入数据实例化了我的模型(Entry)的对象,然后继续对其执行所需的操作。 Django会自动检查数据是否符合我在模型字段(CharField,max_length等)中设置的条件,并告诉用户是否有错误! 令人印象深刻的是,这甚至没有形式。 为我节省了大量的工作和时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM