我在查Django 1.7。
我有以下范本:
class DeckCreateForm(forms.ModelForm):
csv_file = forms.FileField(required=False)
class Meta:
model = Deck
fields = ['title', 'description']请注意,文件字段不是模型的一部分(我希望保持这种方式)。此文件字段旨在提供一种构造模型甲板的替代方法。
我想知道如何访问上传的文件。我查看了我的媒体目录,但它不在那里。我尝试将"upload_to“添加到csv_file构造函数中,但得到了一个错误:
TypeError: __init__() got an unexpected keyword argument 'upload_to'编辑:
我想知道如何使它与基于泛型类的create视图一起工作,该视图使用了上面的模型表单-在views.py中有:
class DeckCreateView(CreateView):
model = Deck
form_class = DeckCreateForm
template_name = 'deck_create.html'具体来说,我如何修改像http://docs.djangoproject.com/en/1.7/topics/http/file-uploads这样的东西来处理上面基于类的视图。我的urls.py文件:
urlpatterns = patterns(
...
url(r"^deck/create/$", views.DeckCreateView.as_view(), name="deck-create"),
...
)是否有一种方法可以在DeckCreateView中覆盖来处理文件上传?
发布于 2015-01-04 01:03:08
我发现有关文件上传的Django文档对于较新的Django用户来说可能有点难以理解。但是,我认为下面的链接提供了一个非常简洁和易于遵循的过程,一步一步地设置了文件上传表单。
Need a minimal Django file upload example
我相信你会找到你需要的一切。
编辑
作为对OP对基于类视图的编辑和评论的回应,我相信它们比基于函数的视图更清晰,而且看起来更“干净”。这里有一个很好的链接,讨论CBV和FBV,其中包括一个简单但有效的CBV示例。
http://www.datalifebalance.com/2014/04/django-file-uploads-with-class-based-views.html
编辑增编
为了完整,并限制答案对上述外部链接的依赖(有一天可能会消失),我们添加了一些更多的细节。为了达到它们的目的,OP可以覆盖DeckCreateView和DeckCreateForm的post方法,如:
views.py:
...
class DeckCreateView(CreateView):
...
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect(self.success_url)
else:
return render(request, self.template_name, {'form': form})forms.py
...
class DeckCreateForm(forms.ModelForm):
...
def __init__(self, post_data, files_data):
self.csv_file = files_data.get('csv_file', None)
return super(DeckCreateForm, self).__init__(post_data, files_data)
def save(self, *args, **kwargs):
deck = super(DeckCreateForm, self).save(*args, **kwargs)
self.handle_csv_file(self.csv_file, deck)
return deck
def handle_csv_file(f, deck):
...
for chunk in f.chunks():
...
...在表单提交时,将向DeckCreateView::post发送请求。调用DeckCreateForm::save时会发生文件处理。
https://stackoverflow.com/questions/27757332
复制相似问题