Проверка данных формы (эквивалент form.is_valid) в приемнике Django (каналы Django) - PullRequest
0 голосов
/ 01 мая 2019

Я перехожу от настройки на основе 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 вопроса:

  1. Могу ли я создать экземпляр объекта EntryForm в моем consumer.py и затем использовать там метод .is_valid ()? Как мне это сделать, поскольку это не http-запрос?

  2. Если нет, то как еще можно проверить мои данные form_entry, чтобы убедиться, что они соответствуют условиям полей модели (DecimalField, CharField, max_length и т. Д.)?

1 Ответ

0 голосов
/ 06 мая 2019

Это оказалось проще, чем я думал.Не нуждался в DRF или любой другой структуре.

В моем потребителе я создал экземпляр объекта моей модели (Entry), используя входящие данные из внешнего интерфейса, а затем приступил к выполнению над ним необходимых операций.Django автоматически проверяет, соответствуют ли данные критериям, которые я установил в полях моей модели (CharField, max_length и т. Д.), И сообщает пользователю, если произошла ошибка!Впечатляет, что это работает даже без форм.Спасло мне много работы и времени.

...