Как передать контекст в другую функцию представления? (Django)

Мой models.py:

class fields(models.Model):
      name = models.CharField(max_length=18)
      link = models.TextField()

Ссылка содержит гиперссылку связанного имени.

Мой views.py:

def index(request):
    listing = fields.objects.all()
    context ={'listing':'listing'}
    return render(request,'index.html',context)

Теперь я хочу передать контекст этой функции, включающий только link, другой функции представления, чтобы другая функция представления была:

def bypass_link(request):
    # get the link from above function
    # execute some selenium scripts in the link

Простой шаблон, иллюстрирующий это, будет выглядеть следующим образом:

{% for i in listing %}
<tr>
<td data-label="name">{{ i.name }}</td>
<td data-label="Quote"><button><a href ="{ % url 'bypass_link' %} " target="_blank">{{ i.link }}</a></button></td>
<tr>
{% endfor %}

Вы можете передать id объекта в url, изменив следующее:

шаблон

<td data-label="Quote">
    <a href="{% url 'bypass_link' i.id %}" target="_blank">{{ i.link }}</a>
</td>

urls.py

from django.conf.urls import url 

url(r'^bypass_link/(?P<pk>\d+)/$', views.bypass_link, name="bypass_link"),

Тогда в вашей функции вам нужно найти тот же экземпляр модели и затем извлечь ссылку.

def bypass_link(request, pk=None):
    instance = fields.objects.get(pk=pk)
    print(instance.link) # now you have your link

Теперь у вас есть доступ к ссылке через instance.link

В Django вы можете передавать переменную различным представлениям, используя session

В моем примере используется Django 3.2, убедитесь, что требования к сессиям установлены в settings.py. Но в конфигурации по умолчанию следующий пример должен работать.

def index(request):
    listing = fields.objects.all()
    # The session object must be json serializable, pay attention
    listing_list = [[list.name, list.i] for list in listing]
    # set the session variable
    request.session['listing_list'] = listing_list
    context ={'listing':listing}
    return render(request,'index.html',context)

def bypass_link(request):
    # get the link from above function
    # execute some selenium scripts in the link

   # Got the session variable
   listing_list = request.session.get('listing_list')
   # Do what you want with it here
Вернуться на верх