Django modelForm没有将文件保存到DB

时间:2018-06-13 21:33:28

标签: django python-3.x django-models django-forms

Django 2.0 Python 3.6

我遇到了一个没有保存通过表单选择的文件的Django表单的问题;无论何时选择要上传的文件,我都会收到消息"此字段为必填项。"。

我在Model FileField中放置了一个blank=True和一个null=True来摆脱它,但每当我尝试加载html时,我都会收到此错误:"&#34 39; copydoc' attirbute没有与之关联的文件。"

我希望用户能够登录,创建条目并上传文件以及所述条目。为什么DB不接受表单中的文件?

谢谢。

views.py:

from django.shortcuts import render, redirect
from .models import notarizer, CustomUser, notarizerCreateForm
# from .forms import notarizerCreateForm
# Create your views here.

def home(request):
    t = 'home.html'
    return render(request, t)


def page1(request):
    t = 'log1/page1.html'
    if request.user.is_authenticated:
        logger = notarizer.objects.filter(userziptie=request.user).order_by('-date')
        return render(request, t, {'logger': logger})
    else:
        return redirect(home)


def create_entry(request):
    createPath = 'log1/create_entry.html'
    if request.method == 'POST':
        if request.method == 'FILES':
            form = notarizerCreateForm(request.POST, request.FILES)
            if form.is_valid():
                instance =notarizerCreateForm(
                                              file_field=request.FILES['file']
                                              ) 
                instance.save()
            else:
                print(form.errors)
        else:
            form = notarizerCreateForm(request.POST)
            if form.is_valid():
                form.save()
            else:
                print(form.errors)
    else:
        form = notarizerCreateForm()
    return render(request, createPath, {'form': form})

create_entry.html:

{% extends "base.html" %}
{% block placeholder1 %}
<div class="form-holder">
  <form name="form" enctype="multipart/form-data" method="POST" 
    action="/create_entry/" >
    {% csrf_token %}
      {{ form.as_table }}
     <input type="submit"/>
  </form>
</div>
{% endblock %}

models.py:

from django.db import models
from users.models import CustomUser
from django.forms import ModelForm

# Create your models here.

class notarizer(models.Model):
    date = models.DateField(auto_now_add=True)
    docName = models.CharField(max_length=25, null=False)
    describe = models.TextField(max_length=280)
    signee = models.CharField(max_length=25, null=False)
    signeeDets = models.TextField(max_length=280)
    copydoc = models.FileField(upload_to='users/', blank=True, null=True)
    userziptie = models.ForeignKey('users.CustomUser', 
on_delete=models.DO_NOTHING, null=True)


    def __str__(self):
        return "{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}".format(
                                                            self.pk,
                                                            self.date,
                                                            self.docName,
                                                            self.describe,
                                                            self.signee,
                                                            self.signeeDets,
                                                            self.userziptie
                                                            )


class notarizerCreateForm(ModelForm):
    class Meta:
        model = notarizer
        fields = ['docName','describe','signee','signeeDets', 'copydoc']

1 个答案:

答案 0 :(得分:1)

有些事情会使视图工作流程变得非常奇怪:

  1. 您检查request.method,首先检查它是否是'POST'这是一个好主意,但是检查它是否为'FILES',没有名为{{的{HTTP}方法1}},只有FILESGETPOSTPATCHPUT等;
  2. 你打电话给OPTIONS这又是应该发生什么,但是你创建一个新的form.is_valid() ,并且只传递一个参数;和
  3. 如果是Form,您应该返回呈现的页面,但会重定向到POST页面(例如显示结果)。工作流通常是 Post-redict-get ,因为如果用户刷新浏览器,我们想再次发布相同的帖子。
  4. 工作流程应如下所示:

    GET