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']
答案 0 :(得分:1)
有些事情会使视图工作流程变得非常奇怪:
request.method
,首先检查它是否是'POST'
这是一个好主意,但是检查它是否为'FILES'
,没有名为{{的{HTTP}方法1}},只有FILES
,GET
,POST
,PATCH
,PUT
等; OPTIONS
这又是应该发生什么,但是你创建一个新的form.is_valid()
,并且只传递一个参数;和Form
,您应该不返回呈现的页面,但会重定向到POST
页面(例如显示结果)。工作流通常是 Post-redict-get ,因为如果用户刷新浏览器,我们不想再次发布相同的帖子。工作流程应如下所示:
GET