【问题标题】:Django returns if request.method statement false and returns blank template如果 request.method 语句为 false 则 Django 返回并返回空白模板
【发布时间】:2018-08-26 00:11:07
【问题描述】:

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

这是我在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>

主要问题是,经过一番检查和搜索,我发现它没有返回任何内容,主要是因为model_form_upload视图中的if request.method == 'POST'语句返回False,所以它只是呈现没有表格的模板。所以我真的不明白为什么它似乎在那里返回 false。

【问题讨论】:

  • 你试过&lt;input type="submit"&gt;而不是按钮吗?
  • 我试过了,好像没什么变化
  • 没关系,我错过了问题的症结,@xyres 已经发现了。

标签: django file templates upload


【解决方案1】:

您的视图将只处理表单,或在POST 请求的情况下返回表单。

但是您通过单击链接向您的视图发出请求,该链接发出的是GET 请求,而不是POST 请求。

由于链接无法发出POST 请求,因此您必须使用 JS 来执行此操作,或者您可以创建一个像这样的小表单:

<form method="POST" action="{% url 'main:upload' %}">
    {% csrf_token %}
    <input type="submit">
</form>

您可以使用 CSS 设置 submit 按钮的样式,使其看起来像普通链接。当您单击它时,POST 请求将进入您的视图,并在响应中返回上传表单。


许多网站也使用上述使用小型 from 而不是链接的技术来实现“注销”功能,以将注销操作仅限于 POST 请求。


更新:

您想显示一个空的上传表单,对吗?那么,既然如此,为什么不为GET 请求呈现一个空表单。

这就是它的作用:

  1. 如果请求方法为POST,则处理表单数据。
  2. 如果表单有效,则保存数据。然后重定向到'main:register'
  3. 如果表单无效,则呈现与表单相同的模板。
  4. 如果请求方法是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})

现在,您可以通过常规的&lt;a href="{% url 'main:upload' %}"&gt; 链接以旧方式访问上传页面。

【讨论】:

  • 感谢您的回答,但这似乎并没有改变什么,我仍然得到一个空白模板
  • @CatalinC 你把这段代码放在哪里(在哪个文件中)?
  • 我把它放在名为 user_panel.html 的模板中,我最初将按钮与上传一起放在该模板中,然后从那里返回另一个带有上传表单的按钮
  • @CatalinC 这是否意味着您现在在该模板中有两个按钮?您需要单击表单内的那个。并且表单需要enctype="multipart/form-data",作为另一个模板中的一个。
  • @CatalinC 查看 xyres 对问题的更新。我以为您想单击按钮上传文件(原始答案让您成功了一半),但您只想转到上传表单。那么问题是您如何处理上传视图中的else:。这种视图的第一个请求总是GET(对于空表单),只有第二个请求(点击提交后)是POST
猜你喜欢
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2016-01-10
  • 2020-04-07
  • 2015-10-11
  • 2017-07-20
相关资源
最近更新 更多