小编hor*_*rse的帖子

限制用户可以上传的文件数量

我有一个多文件上传,并希望将用户限制为每个上传 3 次。我的问题是我需要知道user已经在数据库中创建了多少个文件以及他们当前正在上传多少个文件(他们可以一次上传多个文件,并且可以上传多次)。

我尝试了很多事情,包括:

创建验证器(验证器传递的是添加的实际文件,而不是model,因此我无法访问model以获取它的id调用if StudentUploadedFile.objects.filter(student_lesson_data=data.id).count() >= 4:)。

clean(self):( 中clean进行验证一次只通过一个实例,并且在清除所有文件之前不会更新数据库,因此我可以计算数据库中已有的文件,但无法计算当前正在上传的文件数量)。

使用pre-save方法(如果在传递给我的pre-save方法的每个文件之间更新了数据库,它将起作用,但只有在上传的所有文件都通过我的pre-save方法后才更新数据库)。

我的post-save尝试:

@receiver(pre_save, sender=StudentUploadedFile)
def upload_file_pre_save(sender, instance, **kwargs):

    if StudentUploadedFile.objects.filter(student_lesson_data=instance.data.id).count() >= 4:
        raise ValidationError('Sorry, you cannot upload more than three files')
Run Code Online (Sandbox Code Playgroud)

编辑:

模型.py

class StudentUploadedFile(models.Model):
    student_lesson_data = models.ForeignKey(StudentLessonData, related_name='student_uploaded_file', on_delete=models.CASCADE)
    student_file = models.FileField(upload_to='module_student_files/', default=None)
Run Code Online (Sandbox Code Playgroud)

视图.py

class StudentUploadView(View):
    def get(self, request):
        files_list = StudentUploadedFile.objects.all()
        return render(self.request, 'users/modules.html', …
Run Code Online (Sandbox Code Playgroud)

django django-validation

8
推荐指数
1
解决办法
672
查看次数

单元测试:如何模拟 MEDIA_ROOT 但仍然访问存储在我的普通 MEDIA 文件夹中的文件

我正在测试我的一个网页 POST 功能。if request.method == 'POST'它生成一个 pdf 并将其附加到用户。每次我运行测试时,我都会生成在我的 MEDIA 文件夹中构建的 pdf 文件,我必须手动删除它们。我决定寻找防止这种情况发生的方法,在我看来最好的方法是用临时文件覆盖我的 MEDIA_ROOT。

我收到以下错误消息

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Acer\\AppData\\Local\\Temp\\profile_pics\\default.jpg'
Run Code Online (Sandbox Code Playgroud)

我确定这是因为我必须在运行测试之前创建并登录一个用户(我不想在设置中这样做,因为我必须为不同的测试生成不同类型的用户)。每次创建用户时,他们的个人资料图片都会设置为profile_pics\\default.jpg'

我的理解是模拟的 MEDIA_ROOT 是空的,不包含默认的配置文件图片,所以会抛出错误。

我的问题是如何绕过这个(最好是模拟 default.jpg 图像)?除了模拟 MEDIA_ROOT 文件夹之外,我还找到了其他解决方案,但它们看起来很笨拙,我更喜欢正确地执行此操作,并希望从中学习。

测试.py

from django.test import override_settings
import tempfile

@override_settings(MEDIA_ROOT=tempfile.gettempdir())
def test_redirects_after_POST(self):
    user = User.objects.create_superuser('username')
    self.client.force_login(user)

    response = self.client.post(
        reverse('final_question'), data={
        'answer': 'this has me totally stumped'}
    )

    self.assertRedirects(response, reverse('page_2'))
Run Code Online (Sandbox Code Playgroud)

谢谢你。

django selenium django-testing django-tests

5
推荐指数
1
解决办法
215
查看次数

Django 在生产中下载/上传文件

我有一个当前托管的 Django 项目。我正在提供静态文件,但不知道如何处理 MEDIA 文件夹中的用户文件上传/下载。我读过很多关于 Docker、Nginx 和 Gunicorn 的内容,但不知道我需要哪一个,也不知道如何设置它们。我已经学习了不少于 20 个教程,观看了不少于 15 个 YouTube 视频,但仍然很困惑(我访问了所有 Google 搜索的前 2 页的每个链接)。

我的问题是,我需要其中哪些才能允许用户从网站上传/下载文件?最重要的是,我尝试过让所有三个都工作,但无法弄清楚它们,当然我不是唯一一个在这方面遇到如此大困难的人,是否有一个好的资源/教程可以指导我完成整个过程(我花了 40 多个小时阅读这些内容并试图让它发挥作用,我已经到了这样的地步:只要它能发挥作用,我就不在乎理解它们是如何组合在一起的)?

谢谢。

编辑-这是所要求内容的精简版本。我没有包含 html,因为这是我第一次这样做,而且我使用过 Ajax 和其他东西,这完全是一团糟,我确信会让你感到困惑。

设置.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static_media')

STAT=os.path.join(BASE_DIR, 'static')

STATICFILES_DIRS = [ STAT,
                    os.path.join('static/'),
                    os.path.join('templates/static/'), # for overridden templates css
                    ]
Run Code Online (Sandbox Code Playgroud)

视图.py

class UploadView(View):
    def get(self, request):
        files_list = UploadedFile.objects.all()
        return render(self.request, 'users/modules.html', {'files': files_list})

    def post(self, request, *args, **kwargs):
        data = {}
        
        form …
Run Code Online (Sandbox Code Playgroud)

django nginx gunicorn docker

1
推荐指数
1
解决办法
2419
查看次数

将布尔值转换为自定义字符串

我的数据库中有布尔值,在 Django 项目中,我将它们打印为 pdf。它非常小但我喜欢它们打印为是/否而不是真/假。

我知道如果我在模板中输出布尔值,我可以使用 yesno:

https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#yesno

但我在一个函数中输出这些。我也知道我可以使用 if/else 语句,但希望有一些更简洁的东西。

IE - 是否有一种简短、干净的方法将布尔值转换为自定义字符串。

谢谢你。

python django reportlab

0
推荐指数
1
解决办法
383
查看次数