Представление функции Django для обновления двух шаблонов (текущего и базового) - PullRequest
2 голосов
/ 23 октября 2019

Джанго Начинающий. У меня есть работающее приложение Django (модели, представления, URL-адреса, шаблоны), похожее на то, что вы можете увидеть в руководствах. Я хотел бы вернуть некоторую информацию об отладке и пользователя (например, если элемент уже существует в таблице) в секцию, подобную терминалу, в моем base.html.

Внутри моего стандартного вызова функции представления (превращение загруженного CSV-файла в pandas и генерация вставок в мои нормализованные таблицы) я добавил второй рендер (запрос, ...), который отправляет словарь в мой base.html.

def bulkinsert(request):
    data=None
    context=None
    if request.method== "POST" and request.FILES['myfile']:
        myfile = request.FILES['myfile'] 
        df=pd.read_csv(myfile  ) 
        data_html=df.to_html() 
        context={'data': data_html }   
        m=''

        # now read each row and insert lot, sublot, ...
        for index, row in df.iterrows():
            if  pd.notna(row['lot']):
                lotname=row['lot']
                 ...

                #  check existence of this lot  
                f1=Lot.objects.filter(lotname=lotname).count()

                if f1==0:
                    m+='\n Lot did not exist yet, inserting ...'
                    b1=Lot(lotname=lotname)
                    b1.save() 
                else: 
                    m+=f'\n Lot {lotname} already exists'
 ...
                c2={ 'memo': m}    
                render(request, 'lenses/base.html',c2)

        return render(request, 'bulkinsert.html',context)
    else: 
        form=UploadFileForm()
        data=None
        context=None
    return render(request, 'bulkinsert.html',context)   

Что я должен добавить к своему base.html, чтобы передать этот словарь (c2) в нужный html-раздел?

Пока у меня есть только:

{% block c2 %}      
<p>{{ memo }}</p>         
{% endblock %}

но страница не обновляется, как я ожидал.

1 Ответ

0 голосов
/ 06 ноября 2019

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

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

Замечания: Я не понимаю, почему вы вызываете функцию рендеринга, но не возвращаете ее. Кроме того, вы перезаписываете свой c2 с каждой итерацией.

Исходя из того, что я предполагаю, что вы хотите сделать, я предлагаю следующий код:

views.py

def bulkinsert(request):
    data=None
    context=None
    if request.method== "POST" and request.FILES['myfile']:
        myfile = request.FILES['myfile'] 
        df=pd.read_csv(myfile  ) 
        data_html=df.to_html() 
        context={'data': data_html }   
        memos= []

        # now read each row and insert lot, sublot, ...
        for index, row in df.iterrows():
            if  pd.notna(row['lot']):
                lotname=row['lot']
                 ...

                #  check existence of this lot  
                f1=Lot.objects.filter(lotname=lotname).count()

                if f1==0:
                    message = '\n Lot did not exist yet, inserting ...'
                    b1=Lot(lotname=lotname)
                    b1.save() 
                else: 
                    message = f'\n Lot {lotname} already exists'
 ...            memos.append(message)
        context['memos'] = memos
        return render(request, 'lenses/base.html',context)
    else: 
        form=UploadFileForm()
        data=None
        context=None
    return render(request, 'bulkinsert.html',context)   

Теперь вам нужно будет повторить свои заметки. Так что также настройте ваш base.html

{% block c2 %}
{% for memo in memos %}      
    <p>{{ memo }}</p>
{% endfor %}         
{% endblock %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...