我正在从基于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个问题:
我可以在我的consumers.py中实例化一个EntryForm对象,然后在其中使用.is_valid()方法吗?既然不是http请求,该怎么办?
如果没有,我如何还能验证form_entry数据以确保其符合模型字段的条件(DecimalField,CharField,max_length等)?
答案 0 :(得分:0)
事实证明,这比我想象的要容易。不需要DRF或任何其他框架。
在我的使用者中,我使用来自前端的传入数据实例化了模型的一个对象(Entry),然后继续对其执行所需的操作。 Django自动检查数据是否符合我在模型字段中设置的条件(CharField,max_length等),并告诉用户是否有错误!非常令人印象深刻的是,即使没有表单,它也可以工作。为我节省了很多工作和时间。