Django文件无法上传

时间:2015-11-14 20:41:39

标签: python django upload

我正在开发一款可让用户构建自己的数据库的应用,他们可以创建的一个字段是照片字段。我正在使用表单模型,虽然它捕获了其余的数据,但它不会尝试获取文件。

我在网站上的其他地方上传文件,如果我在管理面板中手动上传文件,它就会显示正常,但表单本身不会抓取文件。

在我的模板中,我有:

<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)])

然而,这是同样的问题,它会创建该字段很好,但它不会尝试抓取该文件。我不确定为什么它只是在这里失败,因为这适用于网站上的其他任何地方。

1 个答案:

答案 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为空,它会检查是否附加了文件和正确的字段类型,如果没有,则只创建空字段。