如何在不刷新的情况下提交表单?

时间:2020-04-16 12:36:03

标签: javascript python jquery django ajax

我知道这个问题可能是很多stackoverflow的重复。但是那些并没有帮助我。 我尝试了this,但没有刷新就没有成功。

我的gwmh<-function(target,N,x,sigmasq){ p<-add.var() samples<-c(x,p) for(i in 2:N){ prop<-rnorm(1,0,sqrt(sigmasq)) if(runif(1)<min(1,(target(x+abs(prop)*p))/target(x))){ x<-x+prop samples<-rbind(samples,c(x,p))} else{ p<--p samples<-rbind(samples,c(x,p)) } } samples[(1:N)] ##delete after testing } 是:

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

这将导致MultiValueDictKeyError

我尝试了

    $(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!")
            }
        });
    });

那只会从输入中获取值并传递。但我不能不刷新就提交。谁能帮我吗?

编辑1-MultiValueDictKeyError

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

编辑2 实际上,使用此表单甚至都没有提交

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

这将在db中提交值为“ False”的表单。提交表格后,我应该收到警报了吗?因此,请省略此部分。

2 个答案:

答案 0 :(得分:1)

解决方案1 ​​

让我们解决这个问题,有2个解决方案。简单的方法只是消除无用痛苦的更好解决方案。将脚本放入HTML文件中,并使用此行

csrfmiddlewaretoken: '{%csrf_token%}'

代替

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


解决方案2

另一种解决方案是修复您自己的解决方案。 AJAX按钮不是提交按钮,它们只是按钮,从表单中删除action并将按钮类型更改为button即可。


编辑:问题不存在于csrf_token中,但是我想展示第一种解决方案,作为实现所需需求的一种简便方法。


BUG 2 为什么这不起作用,我已经回答了before

答案 1 :(得分:0)

我注意到您的脚本有问题。

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

如果完全按照原样复制了它,则会导致错误。试试这个。

csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
相关问题