Как отправить данные словаря с помощью функции перенаправления в Django - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь отправить словарь методом перенаправления. Но не получить его в перенаправленном шаблоне. Я пытался передать словарь, как это было раньше в функции рендеринга, но я не думаю, что делаю это правильно. Я также пытался HttpResponseRedirect , но это тоже не работает. Я получаю странную ошибку

NoReverseMatch at /

views.py

def index(request):
    if request.method == "POST":

        url  = request.POST.get('url', '')

        r = requests.get(url)
        soup = BeautifulSoup(r.content, features="lxml")
        p_name = soup.find_all("h2",attrs={"class": "a-size-mini"})
        p_price = soup.find_all("span",attrs={"class": "a-price-whole"})
        p_image = soup.findAll('img', {'class':'s-image','src':re.compile('.jpg')})

        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="product_file.csv"'


        for name,price,image in zip(p_name,p_price,p_image):
            writer = csv.writer(response)
            row = writer.writerow([image['src'],name.text, price.text,])

            name_data  = [data.text for data in p_name]
            price_data = [data.text for data in p_price]
            image_data = [data['src'] for data in p_image]
            dec = {'name':name_data, 'price':price_data, 'image':image_data, 'url':url}

        return redirect('data', dec)

    return render(request, 'index.html')

urls.py

from django.urls import path, include
from . import views

urlpatterns = [
    path('', views.index, name="index"),
    path('upload',views.upload,name='upload'),
    path('data',views.data,name='data')
]

1 Ответ

0 голосов
/ 09 октября 2019

Если вы хотите использовать метод redirect() и передать в dict другую функцию представления. Вы можете сделать что-то похожее на это.

def index(request):
     ...        
     dec = {'name':name_data, 'price':price_data, 'image':image_data, 'url':url}
     return redirect('data', kwargs = dec)
     ...

, а затем вам нужно иметь функцию просмотра, которую вы используете для перенаправления, принимающего аргумент **kwargs, обязательно измените urls.py.

def data(request, **kwargs):
    // use **kwargs and render the template with the dict.

Если выхотите получить параметры в качестве параметра запроса из URL.

Вы можете использовать прямые URL-адреса в методе redirect().

from django.urls import reverse
import urllib.parse

def index(request):
    ...
    dec = {'name':name_data, 'price':price_data, 'image':image_data, 'url':url}
    url = '{}?{}'.format(reverse('data'), urllib.parse.urlencode(dec)) # /data/?name=abc&price=45 ..
    return redirect(url)

, а затем использовать параметры.

def data(request):
    name = request.GET.get('name')
    # Do something here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...