2015-01-03 2 views
1

Я запускаю Django 1.7.Как получить доступ к формам Django. Файл FileField (* not models.FileField *)?

У меня есть следующий вид модели:

class DeckCreateForm(forms.ModelForm): 
    csv_file = forms.FileField(required=False) 
    class Meta: 
     model = Deck 
     fields = ['title', 'description'] 

Обратите внимание, что поле файл не является частью модели (и я хотел бы сохранить его таким образом). Это поле файла предназначено для предоставления альтернативных способов построения модели Deck.

Я хотел бы знать, как получить доступ к загруженному файлу. Я смотрел в своем медиа-каталоге, но его там нет. Я попытался добавить «upload_to» в конструктор csv_file, но получаю сообщение об ошибке:

TypeError: __init__() got an unexpected keyword argument 'upload_to' 

EDIT:

Я хотел бы знать, как заставить это работать с общим классом на основе создания вида, что делает использование указанного выше вида модели - в 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 для обработки загрузить файл?

+3

https://docs.djangoproject.com/en/1.7/topics/http/file-uploads/ это очень хорошо объясняет процесс. – kviktor

+0

kviktor - Я отредактировал вопрос в ответ на ваш комментарий. Я хочу применить это к представлению с общим классом. –

ответ

0

Я обнаружил, что документация Django, касающаяся загрузки файлов, может быть немного сложной для понимания для новых пользователей Django. Тем не менее, я думаю, что следующая ссылка обеспечивает очень краткий и простой шаг за шагом в процессе настройки формы загрузки файла.

Need a minimal Django file upload example

Я считаю, что вы найдете все, что нужно там.

Редактировать

В ответ на соображения, основанные редактировать и оставлять комментарии по поводу класса Ор, я считаю, что они могут быть более ясным и, возможно, «чище» ищет код, чем вид на основе функций. Вот отличная ссылка, обсуждающая CBV и FBV, которая включает простой, но эффективный пример CBV.

http://www.datalifebalance.com/2014/04/django-file-uploads-with-class-based-views.html

Приложение для редактирования

Для полноты картины, а также ограничить зависимость ответа на выше внешней ссылке (которая может исчезнуть в один день), мы добавим еще несколько деталей. Для достижения своей цели, ОП может переопределить метод пост DeckCreateView и сохранить, __init__ из DeckCreateForm так:

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.

+0

Aus_lacy - спасибо, что это почти все, что мне нужно. Можете ли вы кратко прокомментировать, как изменить этот пример для работы с созданным на основе класса представлением (см. Редактирование на мой вопрос)? –

+0

См. Редактирование моего ответа. –