如何更改用户在 Django 中复制的 URL?

问题描述 投票:0回答:1

构建 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 %}
django url django-views
1个回答
0
投票

为了解决由于投票机制导致“复制链接”操作未复制实际 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,但常规单击仍将执行投票操作,然后按预期重定向。

© www.soinside.com 2019 - 2024. All rights reserved.