2015-11-14 122 views
0

我正在研究一个应用程序,它可以让用户建立自己的数据库,并且他们可以创建的字段之一是照片字段。我正在使用表单模型,并且在捕获其余数据的同时,它不会尝试抓取文件。Django文件没有上传

我有文件上传在网站上的其他地方工作,如果我在管理面板上手动上传文件,它显示得很好,但表单本身不会抓取文件。

在我的模板,我有:

<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

我的不好,我想出了问题。

在我的意见,我在那里:

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))是空的,因为它是文件,而不是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的领域出现空白,它会检查,看看是否有附加的文件和正确的字段类型,如果没有的话它只是创建空的领域。