如何将上下文传递给不同的视图函数?(Django)

How to pass context to a different view function?(Django)

我的models.py:

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

link包含相关名称的hyperlink。

我的views.py:

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

urls.py

urlpatterns = [
   
    path('admin/', admin.site.urls),
    path('',index,name="index"),
]

模板:

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

这会重定向到模板中显示的 hyperlink,但我想在它重定向到此 link.

后进行一些自动化操作

现在,我想将仅包含 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"),

然后在你的函数中你需要找到相同的模型实例然后提取 link.

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

现在您可以通过 instance.link

访问 link

您可以使用 session

将变量传递给 Django 中的不同视图

我的示例使用的是 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