Я перехожу от настройки на основе http (формы Django, представления и т. Д.) К настройке веб-сокета с использованием каналов Django (причины неизбежны). В моей настройке на основе http я вводил некоторые данные, используя форму (3 поля - имя, номер, город) в моем шаблоне:
<form id="EntryForm" method="POST">
{% csrf_token %}
<div class="form-group ">
{{ form }}
</div>
<button type="submit">Submit</button>
</form>
Поскольку эти данные ранее были представлены в виде формы Django (которая была сопоставлена с моей моделью Django с использованием «class Meta:»), я легко смог проверить ее в моем views.py с помощью метода form.is_valid () , Каждое поле в данных формы имеет определенные условия, такие как CharField (max_length) и т. Д., Которые проверялись методом is_valid () в моих views.py:
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.')
...
Как вы можете видеть выше, форма принадлежит классу формы "EntryForm" в моем forms.py, который сопоставляется с моделью с именем Entry в моем models.py (который содержит поля, такие как имя, номер и город).
Но в Django Channels, для отправки данных формы, так как мне приходится использовать скрипт для .preventDefault (), а затем отправлять данные в виде отдельного словаря в мой consumer.py, он туда не попадает как форма Джанго. Вот мой сценарий:
<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 отправляются в мой consumer.py, но поскольку больше не является объектом формы Django, я не могу использовать метод .is_valid () для проверки данных (CharField max_length и т. Д.). Мне нужно проверить данные, прежде чем я смогу обработать их в моих потребителях .py
Официальная документация не покрывает это, потому что она использует пример приложения чата, которое не требует такой проверки. На самом деле он даже не использует формы Django.
У меня есть 2 вопроса:
Могу ли я создать экземпляр объекта EntryForm в моем consumer.py и затем использовать там метод .is_valid ()? Как мне это сделать, поскольку это не http-запрос?
Если нет, то как еще можно проверить мои данные form_entry, чтобы убедиться, что они соответствуют условиям полей модели (DecimalField, CharField, max_length и т. Д.)?