我试图为我的项目上传一个简单的文件,但似乎有问题。因此,一旦用户被记录,我尝试通过单击按钮上传文件,但结果是一个空白模板。
这是我在views.py中的上传功能:
def model_form_upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('main:register')
else:
return render(request, 'main/model_form_upload.html', {'form': form})
else:
return render(request, 'main/user_panel.html')
forms.py中的类:
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = ('description', 'document')
models.py中的类:
class Document(models.Model):
description = models.CharField(max_length=255, blank=True)
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField(auto_now_add=True)
和网址:
url(r'^upload/$', views.model_form_upload, name='upload')
在model_form_upload.html我有这个:
{% extends 'main/user_base.html' %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
<p><a href="{% url 'main:upload' %}">Return to home</a></p>
{% endblock %}
我尝试通过单击按钮来渲染模板,它看起来像这样:
<a href="{%url 'main:upload'%}" class="btn btn-primary"><font face="Ubuntu">Upload</font></a>
主要问题是,经过一些检查和搜索后,我发现它并没有返回任何内容,主要是因为if request.method == 'POST'
视图中的model_form_upload
语句返回{{1}所以它只是渲染没有表单的模板。所以我真的不明白为什么它似乎在那里回归。
答案 0 :(得分:1)
您的视图只会处理表单,或者在POST
请求时返回表单。
但是,您是通过点击链接发出请求,该链接正在发出GET
请求,而不是POST
请求。
由于链接无法发出POST
请求,您必须使用JS来执行此操作,或者您可以创建一个这样的小表单:
<form method="POST" action="{% url 'main:upload' %}">
{% csrf_token %}
<input type="submit">
</form>
您可以使用CSS设置submit
按钮的样式,使其看起来像普通链接。当您点击它时,POST
请求将转到您的视图,它将在响应中返回上传表单。
上述使用小而不是链接的技术也被许多网站用于&#34;退出&#34;将注销操作仅限制为POST
请求的功能。
<强>更新强>
你想要显示一个空的上传表格,对吧?那么,在这种情况下,为什么不为GET
请求呈现一个空表单。
以下是它的作用:
POST
,请处理表单数据。'main:register'
。GET
,请创建空表单实例并进行渲染。以下是代码:
def model_form_upload(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('main:register')
else:
form = DocumentForm()
return render(request, 'main/model_form_upload.html', {'form': form})
现在,您可以通过常规<a href="{% url 'main:upload' %}">
链接以旧方式访问上传页面。