Как отправить форму без обновления в django? - PullRequest
0 голосов
/ 16 апреля 2020

Я знаю, что этот вопрос может быть дубликатом многих в stackoverflow. Но это не помогло мне. Я попробовал это , но без обновления не удалось.

Мой models.py:

class Messages(models.Model):
    id = models.CharField(max_length=8, primary_key=True)
    messages = models.TextField()

Это мой html

    <form action="{% url 'messages' %}" method="post" id="new_message_form">
        {% csrf_token %}
        <label for="">message</label><br>
        <textarea id="message" cols="30" rows="10"></textarea><br>
        <button type="submit">Submit</button>
    </form>

Это мой views.py:

def messages(request):
    if request.method == "POST":
        message = Messages()
        message.messages = request.POST['message']
        message.save()
        return redirect('messages')

    return render(request, 'app/messages.html', context)

А это мой script:

    $(document).on('submit', '#new_message_form', function(e){
        e.preventDefault();
        $.ajax({
            type: 'POST',
            url: '/messages/',
            data: {
                message: $('#message').val(),
                csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
            },
            success:function(){
                alert("New message created!")
            }
        });
    });

Это приводит к MultiValueDictKeyError

Вместо этого я попытался

message.messages = request.POST.get('message', False)

Это только получает значение от входа и передает. Но я не могу представить его без обновления. Кто-нибудь может мне помочь?

РЕДАКТИРОВАТЬ 1 - MultiValueDictKeyError

Internal Server Error: /messages/
Traceback (most recent call last):
  File "C:\Users\mowli\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\utils\datastructures.py", line 76, in __getitem__
    list_ = super().__getitem__(key)
KeyError: 'message'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\mowli\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\mowli\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\mowli\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\mowli\Desktop\Projects\gcepac\app\views.py", line 17, in messages
    message.messages = request.POST['message']
  File "C:\Users\mowli\AppData\Local\Programs\Python\Python38-32\lib\site-packages\django\utils\datastructures.py", line 78, in __getitem__
    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'message'
[16/Apr/2020 18:12:30] "POST /messages/ HTTP/1.1" 500 90361

РЕДАКТИРОВАТЬ 2 На самом деле форма даже не отправляется при использовании этого

message.messages = request.POST.get('message', False)

Это отправляет форму с значение «Ложь» в БД. После отправки формы я должен получить предупреждение, верно? Поэтому, пожалуйста, пропустите эту часть.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Решение 1

Давайте рассмотрим проблему. Есть 2 решения. Простое решение, которое является лучшим решением для устранения бесполезной боли. поместите скрипт в ваш файл HTML, и используйте эту строку

csrfmiddlewaretoken: '{%csrf_token%}'

вместо

csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),


Решение 2

Другое решение - это исправить ваше собственное решение. AJAX кнопки не являются кнопками отправки, они просто кнопки. Удалите action из формы и измените тип кнопки на button, и она должна работать.


РЕДАКТИРОВАТЬ: Проблема не в csrf_token, однако я хотел показать первое решение как более простой способ достижения того, что вам нужно.


BUG 2 Почему это не работает, я ответил на это до
0 голосов
/ 16 апреля 2020

Я заметил проблему в вашем скрипте.

csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken').val(),

Если вы скопировали это именно так, как это было причиной ошибки. Попробуйте это.

csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...