javascript - 提交帖子请求并点击另一个帖子请求后,如何保持在同一页面上?
问题描述
我正在做一个单页网站,我想在其中输入一些文本并上传文件。基本上,我希望我的表单在前端的样子是,首先我可以在给定的文本区域中输入一些文本,在下面我应该能够选择多个文件,一旦选择了文件,我将点击上传按钮,文件应该被上传,然后我会点击提交,这就是我创建帖子的方式。
我在下面附上我的代码。我确实写了我损坏的views.py
文件,但我现在不附加它。
models.py :
class Post(models.Model):
post_body = models.TextField(blank=False, max_length=500)
class PostMedia(models.Model):
file = models.FileField()
body = models.ForeignKey(Post, on_delete=models.CASCADE)
forms.py :
from django.forms import ClearableFileInput
from django.forms import ModelForm
from .models import Post, PostMedia
class PostModelForm(ModelForm):
class Meta:
model = Post
fields = ['post_body']
class PostMediaModelForm(ModelForm):
class Meta:
model = PostMedia
fields = ['file']
widgets = {
'file': ClearableFileInput(attrs={'multiple': True}),
form.html (I was trying to write the jquery function):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
$('text-form').on('submit',upload(e) {
e.preventDefault();
$.post( '../create-post', $('form').serialize(), function( data ) {
alert( data );
} );
});
</script>
<div class="site-form">
<h2>Create a New Post here! </h2>
<form action="." method="post" name="text-form">
{% csrf_token %}
{{ form }}
<br><br>
<form action="." method="post" name="file-form" enctype="multipart/form-data" data-ajax="false">
{% csrf_token %}
{{ file_form }}
<br><br>
<input type="submit" value="Upload files" onclick="upload(); return false;"/>
<br><br>
<input type="submit" value="Create post"/>
</form>
</form>
</div>
urls.py
url(r'^/create-post', upload_files, name='create-post'),
url(r'^/submit-post', submit_post, name='submit-post'),
现在,我希望当我单击上传按钮时,我应该留在同一页面上,但在后台,views.py
它应该实际保存选定的文件(考虑到我无法保存文件,除非我保存外键的文本bcz),然后我可以点击提交按钮保存帖子。
我如何实现这一目标?只需提供工作流程也将不胜感激。我对jquery或ajax一无所知,我猜他们在这里做的伎俩..
解决方案
好吧,我想我可以帮助你处理 javascript
<button onclick="upload(); return false;">Upload files<button/>
<input type="submit" id="create_post_button" value="Create post"/>
在第一个脚本标签内添加
$(function() {
$("#create_post_button").hide();
});
如果您不希望在上传文件之前显示创建帖子按钮。
然后在上传功能
function upload(){ event.preventDefault();
data = new FormData();
data.append( 'file', $( '#file' )[0].files[0] );
//files if is multiple
//is necessaty add an id to make it easier but you can access to the html element with $(input[name='inputname']) if you want to keep wht input type button
$.ajax({
url: 'url to post',
data: data,
processData: false,
type: 'POST',
success: function ( data ) {
$("#create_post_button").show();
}
});}
我建议您如果输入文件不应该在表单内,您将其从表单中移开,例如在关闭表单的标签下方,因为如果不是,您将发送文件两次并且没有必要。如果您只想在有文件时这样做,那么您可以上传我建议您这样做的所有表格
在表单中添加一个 id,然后
$("#formreference").submit(function(){
var formData = new FormData($(this)[0]); //with this form data send to server with a post request similar that the shown before });
我认为阅读提交的dom事件更好,在这种情况下只需要上传功能
function upload(){ event.preventDefault(); $("#create_post_button").show();}
推荐阅读
- javascript - 如何在 django 中删除对象而不渲染 html 页面以获得确认
- postgresql - 如何计算 PostGIS 中有多少缓冲区相交
- javascript - jQuery - 为验证器计数项目(使用.length)不起作用
- c# - 关系查询过多导致查询时间无限?
- java - Front 和 Rear 元素只显示当前添加的元素,而不是第一个添加的元素和最后一个添加的元素
- r - 在条形图中添加百分比标签(gglot2)
- reactjs - 具有类型支持的可重用 api 钩子
- django - 如何通过 Django 中的 SOCKS 代理访问 Postgres
- python - 稀疏矩阵连接
- opengl - CPU 到 GPU 的法线映射