- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Attachment
模型,该模型在 Django 1.4.1 应用程序中具有 FileField
。此 FileField
有一个可调用的 upload_to
参数,根据 Django docs应该在保存表单(以及模型)时调用。
当我运行下面的 FormTest
时,永远不会调用 upload_to
可调用函数,因此该文件不会出现在 upload_to< 提供的位置中
方法。我做错了什么?
请注意,在 ModelTest
(也在下面)中通过测试时,upload_to
方法按预期工作。
我看过的事情不是似乎是问题所在:
Attachment
模型中属性的顺序。我发现一些问题似乎表明这个顺序很重要。由于我的 upload_to
方法使用 directory
属性,我认为他的方法可能会导致问题。它不是。无论如何,这不会导致该方法不被调用。is_valid()
没有被调用。不,我已经确认是这样。测试:
from core.forms.attachments import AttachmentForm
from django.test import TestCase
import unittest
from django.core.files.uploadedfile import SimpleUploadedFile
from django.core.files.storage import default_storage
def suite():
return unittest.TestSuite(
[
unittest.TestLoader().loadTestsFromTestCase(FormTest),
]
)
class FormTest(TestCase):
def test_form_1(self):
filename = 'filename'
f = file(filename)
data = {'name':'name',}
file_data = {'attachment_file':SimpleUploadedFile(f.name,f.read()),}
form = AttachmentForm(data=data,files=file_data)
self.assertTrue(form.is_valid())
attachment = form.save()
root_directory = 'attachments'
upload_location = root_directory + '/' + attachment.directory + '/' + filename
self.assertTrue(attachment.attachment_file) # Fails
self.assertTrue(default_storage.exists(upload_location)) # Fails
附件模型:
from django.db import models
from parent_mixins import Parent_Mixin
import uuid
from django.db.models.signals import pre_delete,pre_save
from dirtyfields import DirtyFieldsMixin
def upload_to(instance,filename):
return 'attachments/' + instance.directory + '/' + filename
def uuid_directory_name():
return uuid.uuid4().hex
class Attachment(DirtyFieldsMixin,Parent_Mixin,models.Model):
attachment_file = models.FileField(blank=True,null=True,upload_to=upload_to)
directory = models.CharField(blank=False,default=uuid_directory_name,null=False,max_length=32)
name = models.CharField(blank=False,default=None,null=False,max_length=128)
class Meta:
app_label = 'core'
def __str__(self):
return unicode(self).encode('utf-8')
def __unicode__(self):
return unicode(self.name)
@models.permalink
def get_absolute_url(self):
return('core_attachments_update',(),{'pk': self.pk})
# def save(self,*args,**kwargs):
# super(Attachment,self).save(*args,**kwargs)
def pre_delete_callback(sender, instance, *args, **kwargs):
if not isinstance(instance, Attachment): return
if not instance.attachment_file: return
instance.attachment_file.delete(save=False)
def pre_save_callback(sender, instance, *args, **kwargs):
if not isinstance(instance, Attachment): return
if not instance.attachment_file: return
if instance.is_dirty():
dirty_fields = instance.get_dirty_fields()
if 'attachment_file' in dirty_fields:
old_attachment_file = dirty_fields['attachment_file']
old_attachment_file.delete()
pre_delete.connect(pre_delete_callback)
pre_save.connect(pre_save_callback)
附件表格:
from ..models.attachments import Attachment
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Div,Layout,HTML,Field,Fieldset,Button,ButtonHolder,Submit
from django import forms
class AttachmentFormHelper(FormHelper):
form_tag=False
layout = Layout(
Div(
Div(
Field('name',css_class='span4'),
Field('attachment_file',css_class='span4'),
css_class='span4',
),
css_class='row',
),
)
class AttachmentForm(forms.ModelForm):
helper = AttachmentFormHelper()
class Meta:
fields=('attachment_file','name')
model = Attachment
class AttachmentInlineFormHelper(FormHelper):
form_tag=False
form_style='inline'
layout = Layout(
Div(
Div(
Field('name',css_class='span4'),
Field('attachment_file',css_class='span4'),
Field('DELETE',css_class='span4'),
css_class='span4',
),
css_class='row',
),
)
class AttachmentInlineForm(forms.ModelForm):
helper = AttachmentInlineFormHelper()
class Meta:
fields=('attachment_file','name')
model = Attachment
更新
我还使用这些单元测试对 Attachment
模型类进行测试 - 全部通过:
from core.models.attachments import Attachment
from core.models.attachments import upload_to
from django.test import TestCase
import unittest
from django.core.files.storage import default_storage
from django.core.files.base import ContentFile
def suite():
return unittest.TestSuite(
[
unittest.TestLoader().loadTestsFromTestCase(ModelTest),
]
)
class ModelTest(TestCase):
def test_model_minimum_fields(self):
attachment = Attachment(name='name')
attachment.attachment_file.save('test.txt',ContentFile("hello world"))
attachment.save()
self.assertEqual(str(attachment),'name')
self.assertEqual(unicode(attachment),'name')
self.assertTrue(attachment.directory)
# def test_model_full_fields(self):
# attachment = Attachment()
# attachement.save()
def test_file_operations_basic(self):
root_directory = 'attachments'
filename = 'test.txt'
attachment = Attachment(name='name')
attachment.attachment_file.save(filename,ContentFile('test'))
attachment.save()
upload_location = root_directory + '/' + attachment.directory + '/' + filename
self.assertEqual(upload_to(attachment,filename),upload_location)
self.assertTrue(default_storage.exists(upload_location))
def test_file_operations_delete(self):
root_directory = 'attachments'
filename = 'test.txt'
attachment = Attachment(name='name')
attachment.attachment_file.save(filename,ContentFile('test'))
attachment.save()
upload_location = upload_to(attachment,filename)
attachment.delete()
self.assertFalse(default_storage.exists(upload_location))
def test_file_operations_change(self):
root_directory = 'attachments'
filename_1 = 'test_1.txt'
attachment = Attachment(name='name')
attachment.attachment_file.save(filename_1,ContentFile('test'))
attachment.save()
upload_location_1 = upload_to(attachment,filename_1)
self.assertTrue(default_storage.exists(upload_location_1))
filename_2 = 'test_2.txt'
attachment.attachment_file.save(filename_2,ContentFile('test'))
attachment.save()
upload_location_2 = upload_to(attachment,filename_2)
self.assertTrue(default_storage.exists(upload_location_2))
self.assertFalse(default_storage.exists(upload_location_1))
最佳答案
如果我将 Attachment
模型的 attachment_file
字段更改为不允许空白或空值,则测试可以通过。
具体改变
attachment_file = models.FileField(blank=True,null=True,upload_to=upload_to)
至
attachment_file = models.FileField(blank=False,null=False,upload_to=upload_to)
我不知道为什么这会对我的测试产生影响,并且希望得到 Django 专家的解释。如果这些参数不为 False,为什么 FileField 不会保存文件?
关于Django FileField 未保存到 upload_to 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13040580/
我正在使用 Django 来建立一个网站,我使用两个 FileField 一个供用户上传文档,另一个系统将把文档保存到它的备份中。My Model def file_path_dir(instance
我正在用 django 实现一个应用程序,它有一个带有 FileField 的模型: class Slideshow(models.Model): name = models.CharFiel
我有一个包含 FileField 的模型如下 class Employer(models.Model): logo = models.FileField(storage=FileSys
我觉得不得不问这个问题有点愚蠢……但我似乎找不到任何地方的记录。 如果我有 Model与 FileField , 我怎么能塞一个上传的FILE成FileField ? 例如,我想做这样的事情: cla
我一直在挠头 FileField。 FileField 是否需要单独的过程? 虽然我的网址被保存了..但我的文件没有上传......我做错了什么? 这是我的models.py ... class Op
给定一个带有名为 number 的必填字段的模型和一个 ClearableFileInput FileField 调用 upload_file : class ExampleModel(models.
我需要为 FileField 对象保存文件,该对象的名称和内容不是来自表单(而是来 self 的代码)。怎么办? 我需要这样的东西: field = FileField() ... save_unde
我的 media/logo/ 文件夹中存储了一个图像,我想将其从我的模型保存到模型的 FileField 中看法。这是我尝试过的方法,但遇到编码错误,并且在尝试保存文件后文件已损坏。 UnicodeD
我需要为 FileField 对象保存文件,该对象的名称和内容不是来自表单(而是来 self 的代码)。怎么办? 我需要这样的东西: field = FileField() ... save_unde
我的 media/logo/ 文件夹中存储了一个图像,我想将其从我的模型保存到模型的 FileField 中看法。这是我尝试过的方法,但遇到编码错误,并且在尝试保存文件后文件已损坏。 UnicodeD
我有类似的东西: MEDIA_ROOT = '/home/httpd/foo/media/' MEDIA_URL = 'http://www.example.org/media/' (……) file
我在我的项目中实现了一个 FileField 模型。我可以成功上传 svg 文件并将它们保存到所需位置。 在我的项目中,我大量使用用户上传的图像 (JPG),它们保存到正确的位置,我可以毫无问题地在我
在我的应用程序中上传文件时遇到问题。用户提交报告并可以添加附件(通过外键关系)。我已经显示了内联表单,如果我将其留空,它会正常工作,但是当我尝试上传文件然后提交表单时,出现 500 错误。基础报告已生
如果我正确阅读了文档,那么 Django 中的 FileField 不知道文件的 content_type:https://docs.djangoproject.com/en/2.1/ref/mode
是否可以动态地为 forms.FileField() 赋予初始值? 最佳答案 我不确定,如果这就是你想要的,但是…… 显然,您不能为文件输入设置初始数据(这意味着您将文件发送给用户)。 Django
我正在尝试在模板中调用 FileField 时检索绝对路径(以 http://开头)。 我怎样才能做到这一点? IE:{{fl.uploadedfile}} -> 返回相对路径,如 media/upl
我正在尝试使用 FileField 存储文件,但文件目标的路径大于 100 个字符。如何增加允许的字符数?我试过 max_length=255 但没有用。 谢谢。 编辑:添加模型 class File
我正在尝试构建一个应用程序以使用 Flask 和 WTForms 的 FileField 表单字段将文件上传到 Web 服务器。该帖子正在成功通过,但我很好奇为什么 form.validate_on_
在现有表单中,我使用 FileField 附加不同类型的文件 .txt、.pdf、.png、.jpg 等 并且工作正常,但现在我需要该字段来接受多个文件,因此我使用属性 multiple 作为输入来接
如何获取 FileField 的链接?我尝试了url字段,但它给出了文件路径: In [7]: myobject.myfilefield.path Out[7]: u'/home/xxxx/media
我是一名优秀的程序员,十分优秀!