我认为您只是错过了一个可以帮助您的附加功能。我现在没有时间特别测试这个,但你正在寻找这样的东西:
from django.core.validators import FileExtensionValidator
from django.db import models
from django.contrib.auth.models import User
def content_file_name(instance, filename):
return "Tests/{folder}/{file}".format(folder=instance.TestName, file=filename)
class TestInfo(models.Model):
TestName = models.CharField(max_length=255)
MaxMarks = models.IntegerField()
TimeDuration = models.IntegerField()
PosMarks = models.IntegerField()
NegMarks = models.IntegerField()
InputTextFile = models.FileField(upload_to=content_file_name)
validators[FileExtensionValidator(allowed_extensions['txt'])],blank=False)
def __str__(self):
return self.TestName
更新 - 关于使用用户名作为文件夹名来保存上传的文件
如果您想将 用户名 添加为将保存用户上传内容的子文件夹名称,按用户名添加到不同的子文件夹中。同时,您将上传者的用户名也保留在您的模型中,然后您应该将您的模型表述得更像下面这样。我在您的模型中添加了一个额外字段,即 Uploader_info。它只是在上传时获取用户名,因此上传者用户无法对其进行编辑,它只是在通过请求数据从您的用户表上传时始终给出。
在 models.py 中:
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
def content_file_name(instance, filename):
return "Tests/{subfolder}/{folder}/{file}".format(subfolder=instance.Uploader_info, folder=instance.TestName, file=filename)
def validate_file_extension(value):
if value.file.content_type != 'text/plain':
raise ValidationError('The uploaded file must be a text file')
class TestInfo(models.Model):
Uploader_info = models.CharField(max_length=100, editable=False, null = True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='testinfos', on_delete=models.CASCADE, null=True)
TestName = models.CharField(max_length=255)
MaxMarks = models.IntegerField()
TimeDuration = models.IntegerField()
PosMarks = models.IntegerField()
NegMarks = models.IntegerField()
InputTextFile = models.FileField(upload_to=content_file_name, blank=False, validators=[validate_file_extension])
def __str__(self):
template = '{0.TestName} {0.Uploader_info}'
return template.format(self)
别忘了迁移。
重要!在 admin.py 中注册模型,添加一个简短的功能,将上传者的用户名提供给记录:
在 admin.py 中:
from .models import TestInfo
class TestInfoAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if not change:
obj.Uploader_info = request.user.username
obj.save()
admin.site.register(TestInfo, TestInfoAdmin)
对于表单提交,您当前的视图名称是 post,必须重新表述如下:
在视图中,py
@login_required
def post(request):
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = TestForm(request.POST, request.FILES)
# check whether it's valid:
if form.is_valid():
fulltest = form.save(commit=False)
fulltest.user = request.user
fulltest.Uploader_info = request.user
TestName = form.cleaned_data.get('TestName')
File = form.cleaned_data.get('InputTextFile')
fulltest.save()
messages.success(request, 'Test {} Posted successfully'.format(TestName))
return redirect('Test-Making')
else:
parameters = {
'form': form,
'error': form.errors.as_ul()
}
return render(request, 'Test/post.html', parameters)
# if a GET (or any other method) we'll create a blank form
else:
form = TestForm()
return render(request, 'Test/post.html', {'form': form})
forms.py 中的表单很简单:
class TestForm(forms.ModelForm):
class Meta:
model = TestInfo
fields = ('TestName', 'MaxMarks', 'TimeDuration', 'PosMarks', 'NegMarks', 'InputTextFile')
就是这样。如果您的表格没问题,那么上面的内容将在我成功测试时起作用。