我知道这个问题可能是很多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”的表单。提交表格后,我应该收到警报了吗?因此,请省略此部分。
答案 0 :(得分:1)
让我们解决这个问题,有2个解决方案。简单的方法只是消除无用痛苦的更好解决方案。将脚本放入HTML文件中,并使用此行
csrfmiddlewaretoken: '{%csrf_token%}'
代替
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),
另一种解决方案是修复您自己的解决方案。 AJAX按钮不是提交按钮,它们只是按钮,从表单中删除action
并将按钮类型更改为button
即可。
编辑:问题不存在于csrf_token
中,但是我想展示第一种解决方案,作为实现所需需求的一种简便方法。
答案 1 :(得分:0)
我注意到您的脚本有问题。
csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken').val(),
如果完全按照原样复制了它,则会导致错误。试试这个。
csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),