Как напечатать файл на странице шаблона в Django? - PullRequest
0 голосов
/ 29 февраля 2012

Спасибо за помощь.

У меня есть вид, который позволяет мне загрузить CSV-файл и прочитать его. Я хочу, чтобы данные этого файла были помещены в один из моих шаблонов (и, следовательно, на веб-страницу). Мой взгляд выглядит так:

@login_required
def uploadFunc(request, username):
 user = get_object_or_404(User, username=username)
 if request.method == 'GET':
    return render_to_response('upload.html',{'user':user},context_instance=RequestContext(request))
 elif request.method == 'POST':
    with open('penguins.csv', 'rb') as f:
        reader = csv.reader(f)
        for m in reader:
            print m
        return HttpResponseRedirect("/")

Как видно из

print m
return HttpResponseRedirect("/")

Я распечатываю извлеченные данные (они распечатываются на терминале, но не на веб-странице), а затем перенаправляем страницу загрузки на мою домашнюю страницу, где находится таблица из penguin.csv (не смейтесь над именем! Я знаю :)) надо строить. Дело в том, что я не понимаю (или не знаю), как я могу сообщить своему шаблону index.html, что именно этот файл должен быть помещен в эту таблицу.

Извините за много разговоров, если это сбивает с толку, не стесняйтесь задавать вопросы.

Еще раз спасибо, бларги-бла

1 Ответ

1 голос
/ 01 марта 2012

Вам необходимо сначала загрузить файл и сохранить его на диск (или в память), затем вам нужно сохранить это состояние для следующего запроса. У вас есть несколько способов сделать это, например, в сеансе.

Вот пример, он не проверен и может иметь некоторые ошибки ...

FILE_UPLOAD_DIR = '/tmp'

class UploadFileForm(forms.Form):
    file = forms.FileField()

@login_required
def uploadFunc(request, username):
    user = get_object_or_404(User, username=username)
    if request.method == 'GET':
        return render_to_response('upload.html',{'user':user},context_instance=RequestContext(request))
    elif request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            path = _handle_uploaded_file(request.FILES['file'])
            request.session['uploaded_file'] = path
            return HttpResponseRedirect("/")

def index(request):
    if request.session.get("uploaded_file", None):
        lines = []
        with open(request.session.pop("uploaded_file"), 'rb') as f:
            reader = csv.reader(f)
            for m in reader:
                lines.append(m)

        return render_to_response('index.html', { 'file_lines': lines }, context_instance=RequestContext(request))


def _handle_uploaded_file(source):
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=FILE_UPLOAD_DIR)
    with open(filepath, 'wb') as dest:
        shutil.copyfileobj(source, dest)
    return filepath

Затем в шаблоне для index.html вы можете использовать file_lines для заполнения таблицы.

Я «склеил» этот код из различных фрагментов, которые я только что нашел, вот список URL:

...