我正在开发一款可让用户构建自己的数据库的应用,他们可以创建的一个字段是照片字段。我正在使用表单模型,虽然它捕获了其余的数据,但它不会尝试获取文件。
我在网站上的其他地方上传文件,如果我在管理面板中手动上传文件,它就会显示正常,但表单本身不会抓取文件。
在我的模板中,我有:
<form action="/orgs/{{org.id}}/db/{{db.unique_id}}/rows/add/" method="post" enctype="multipart/form-data">
{% csrf_token %}
...
{% elif column.field_type = 23 %}
{{form.photofield}}
{% endif %}
</form>
在我的模特中:
from django.db import models
def get_upload_file_name(instance, filename):
return settings.UPLOAD_FILE_PATTERN % (str(time()).replace('.','_'), filename)
class DbField(models.Model):
...
photofield = models.FileField(upload_to=get_upload_file_name, null=True, blank=True)
以我的形式:
from django import forms
from byodb.models import DbField
class DbFieldForm(forms.ModelForm):
class Meta:
model = DbField
fields = ('photofield',)
widgets = {'photofield': forms.FileInput()}
在我看来:
def org_database_add_row(request, organization_id=1, db_id=1):
if request.POST:
if request.POST.get(str(column.unique_id)):
if column.field_type == 23:
form = DbFieldForm(request.POST, request.FILES)
if form.is_valid():
f = form.save(commit=False)
...
f.save()
抱歉对列/行内容有任何疑惑,这只是放置字段的数据。如果您需要更多细节,那么我可以添加更多细节,但从表面上看,它看起来应该都能正常工作......
另外,我一直试图让它以另一种方式工作,避免完全使用表单,以便文件字段的名称与我的列相同。
在那个例子中,我的模板中写着:
<input type="field" name="{{column.unique_id}}" id="photofield" />
在我看来,它的内容是:
elif column.field_type == 23:
DbField.objects.create(row=row, column=column, unique_id=column.unique_id, creator=request.user, last_editor=request.user, field_type=column.field_type, photofield=request.FILES[str(column.unique_id)])
然而,这是同样的问题,它会创建该字段很好,但它不会尝试抓取该文件。我不确定为什么它只是在这里失败,因为这适用于网站上的其他任何地方。
答案 0 :(得分:1)
我的坏,我发现了问题。
在我的观点中,我曾在哪里:
if request.POST:
if request.POST.get(str(column.unique_id)):
if column.field_type == 23:
DbField.objects.create(row=row ... photofield=request.FILES[str(column.unique_id)])
失败了因为request.POST.get(str(column.unique_id))是空的,因为它是FILES而不是POST。
我重写了视图以适应:
if request.POST.get(str(column.unique_id)):
...
else:
if request.FILES[str(column.unique_id)]:
if column.field_type == 23:
DbField.objects.create(row=row ... photofield=request.FILES[str(column.unique_id)])
else:
DbField.objects.create(row=row ... all other fields left blank)
这样,如果该字段的request.POST为空,它会检查是否附加了文件和正确的字段类型,如果没有,则只创建空字段。