构建 DJANGO 应用程序。当您单击“复制链接”时,我的其中一个页面上的所有链接都不会返回链接 URL,而是返回我在自定义函数中触发的 GET 命令,对于上下文,单击链接会增加应用程序中的投票计数器,并且然后它会重定向到实际链接,但是如果用户在浏览器中使用右键单击 -> 复制链接,这会阻止用户获取该链接的 URL。
如何拦截“复制链接”请求并将实际 URL 传递给用户?
我无法在网络上找到任何资源来帮助我,因为我不确定我正在搜索的关键字是否正确。
我的投票功能,请注意有两种投票行为,因为有一个投票按钮并单击链接执行投票。
def ItemClicked(request,item_uid):
u = ContentItem.objects.get(contentitemid = item_uid).contentitemurl
session_id = request.session.session_key
VoteForItem(item_uid,session_id)
return redirect (u)
def ItemUpvote(request,item_uid):
session_id = request.session.session_key
VoteForItem(item_uid,session_id)
return redirect('/')
def VoteForItem(item_uid,session_id):
i = ContentItem.objects.get(contentitemid = item_uid)
s = session_id
can_vote = 0
if VotingLog.objects.filter(itemid=item_uid,votesessionid=session_id).exists():
can_vote = 0
else:
can_vote = 1
if can_vote == 1:
i.contentitemvotecount = i.contentitemvotecount + 1
i.save()
new_vote=VotingLog(itemid = item_uid, votesessionid = session_id)
new_vote.save()
然后在我的模板中
{% for c in curated_items %}
<div id="itemrow" class="row">
<div class="column">
<div class="row">
<div id="itemtitle" class="column"><a href="/itemclicked/{{c.contentitemid}}" target="_blank">{{ c.contentitemtitle }}</a></div>
</div>
<div class="row">
<div id="itemmeta" class="column"><p><a href="/upvote/{{c.contentitemid}}">▲</a> {{c.contentitemsource}}, <i>{{c.contentitemdatepublished}}</i></p></div>
<div id="itemmeta" class="column"></div>
</div>
</div>
</div>
{% empty %}
<div class="row">
<div class="column"><p>No objects returned.</p></div>
</div>
{% endfor %}
为了解决由于投票机制导致“复制链接”操作未复制实际 URL 的问题,您可以使用 Javascript 来处理链接上的点击事件。
首先,修改 HTML 以在每个链接中包含投票 URL 和实际 URL。使用 HTML 数据属性来存储实际的 URL:
<a href="/itemclicked/{{c.contentitemid}}"
data-url="{{ c.contentitemurl }}"
class="vote-link">{{ c.contentitemtitle }}</a>
然后,添加 Javascript 以将单击事件侦听器附加到这些链接。
document.querySelectorAll('.vote-link').forEach(function (link) {
link.addEventListener('click', function (e) {
e.preventDefault();
var votingUrl = this.getAttribute('href');
var actualUrl = this.getAttribute('data-url');
fetch(votingUrl, {
method: 'GET',
headers: {
'X-Requested-With': 'XMLHttpRequest',
},
}).then(function () {
window.location.href = actualUrl;
});
});
});
使用此方法,当用户右键单击并选择“复制链接”时,他们将获得实际的 URL,但常规单击仍将执行投票操作,然后按预期重定向。