如果request.method语句为false,则Django返回并返回空白模板

时间:2018-03-16 20:25:24

标签: django file templates upload

我试图为我的项目上传一个简单的文件,但似乎有问题。因此,一旦用户被记录,我尝试通过单击按钮上传文件,但结果是一个空白模板。

这是我在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}所以它只是渲染没有表单的模板。所以我真的不明白为什么它似乎在那里回归。

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请求呈现一个空表单。

以下是它的作用:

  1. 如果请求方法为POST,请处理表单数据。
  2. 如果表单有效,请保存数据。然后重定向到'main:register'
  3. 如果表单无效,请使用表单呈现相同的模板。
  4. 如果请求方法为GET,请创建空表单实例并进行渲染。
  5. 以下是代码:

    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' %}">链接以旧方式访问上传页面。