首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问Django forms.FileField文件(*不是models.FileField*)?

如何访问Django forms.FileField文件(*不是models.FileField*)?
EN

Stack Overflow用户
提问于 2015-01-03 17:08:54
回答 1查看 5.2K关注 0票数 1

我在查Django 1.7。

我有以下范本:

代码语言:javascript
复制
class DeckCreateForm(forms.ModelForm):
    csv_file = forms.FileField(required=False)
    class Meta:
        model = Deck
        fields = ['title', 'description']

请注意,文件字段不是模型的一部分(我希望保持这种方式)。此文件字段旨在提供一种构造模型甲板的替代方法。

我想知道如何访问上传的文件。我查看了我的媒体目录,但它不在那里。我尝试将"upload_to“添加到csv_file构造函数中,但得到了一个错误:

代码语言:javascript
复制
TypeError: __init__() got an unexpected keyword argument 'upload_to'

编辑:

我想知道如何使它与基于泛型类的create视图一起工作,该视图使用了上面的模型表单-在views.py中有:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
urlpatterns = patterns(
    ...
    url(r"^deck/create/$", views.DeckCreateView.as_view(), name="deck-create"),
    ...
)

是否有一种方法可以在DeckCreateView中覆盖来处理文件上传?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
复制
...

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

代码语言:javascript
复制
...

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时会发生文件处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27757332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档