【问题标题】:Passing dynamic javascript variable as url in template在模板中将动态 javascript 变量作为 url 传递
【发布时间】:2020-06-14 01:46:52
【问题描述】:

我正在尝试在 javascript 中创建一个动态 url 以传递给我的 html 模板。

在我的 js 中,我有:

// dynamic url to edit flashcard
function createDynamicURL()
{
    //The variable to be returned
    var URL;

    //The variables containing the respective IDs
    var cardID= cards.cards[current_card].id   //this is defined earlier

    //Forming the variable to return
    URL-="study/[1-9][0-9]/";
    URL+="card-edit/";
    URL+=cardID;

    return URL;
}

在我的模板中我有:

<a id="edit-button" class="btn btn-default btn-warning" href="javascript:window.location=createDynamicURL();"  >Edit</a>

我的 urls.py:

app_name = 'flash'

urlpatterns = [
    re_path(r'^study/(?P<deck_id>[0-9]+)/$', views.study, name='study'),
    re_path(r'^study/(?P<deck_id>[0-9]+)/get_cards/$', views.get_cards, name='get-cards'),
    path("decks/",views.DeckList.as_view(),name="deck-list"),
    path("decks/<int:pk>/",views.DeckDetail.as_view(),name="deck-detail"),
    path("cards/<int:pk>/", views.CardList.as_view(), name="flash-list"),
    path("card-edit/<int:pk>/",views.CardEdit.as_view(),name="flash-edit"),
    path("card-detail/<int:pk>/",views.CardDetail.as_view(),name="flash-detail"),
    path("edit/<int:pk>/",views.DeckUpdate.as_view(),name="edit"),
    path("",views.home,name="home"),

]

我点击时得到的网址: http://127.0.0.1:8000/%2Fflash/study/33/NaNcard-edit/51

正确的网址应该是: http://127.0.0.1:8000/%2Fflash/card-edit/51/

所以至少它给了我正确的 id。但为什么它给我 NaN,我如何摆脱研究/33?请注意,33 并不总是 33,而且我在这里无权访问该 ID,因此我希望它只是任何 2 位数字。

我对javascript没有很多经验,所以很抱歉这个基本问题。任何建议将不胜感激!

研究观点:

@login_required
@ensure_csrf_cookie
def study(request, deck_id):
    """
    Study cards page (JS driven)
    """
    if request.method == 'GET':
        return render(request, 'flash/study.html')


@login_required
@csrf_exempt
def get_cards(request, deck_id):
    """
    Get cards to study (ajax)
    """

    if request.method == 'GET':
        cards = Flashcard.objects.filter(owner=request.user, deck=deck_id,
                                         next_due_date__lte=timezone.now())
        count = len(cards)
        data = {'count': count, 'cards': []}

        num = count if count < CARD_LIMIT else CARD_LIMIT
        if num:
            # generate list of random indexes
            idx = random.sample(range(count), num)
            for i in idx:
                card = cards[i]
                question = '<p>'+'</p><p>'.join(card.question.split('\r\n'))+'</p>'
                answer = '<p>'+'</p><p>'.join(card.answer.split('\r\n'))+'</p>'
                data['cards'].append({'id': card.pk, 'question': question,
                                     'answer': answer})

        return JsonResponse(data)
    else:
        data = json.loads(str(request.body, 'utf-8'))
        for res in data:
            card = Flashcard.objects.get(owner=request.user, pk=res['id'])
            card.save(rating=res['result'])

        return JsonResponse({'status': 'OK'})

【问题讨论】:

  • 您正在初始化一个空字符串 URL,然后调用 "URL-="study/[1-9][0-9]/";",这没有意义,因为 URL 为空那时,这可能是导致字符串 NaN 部分的原因。如果您评论该行,您会得到什么网址?
  • @ketcham 如果我删除“URL-="study/[1-9][0-9]/";”,我会得到:127.0.0.1:8000//flash/study/33/undefinedcard-edit/51
  • 当我把 URL = "/flash" 放在开头时它起作用了。

标签: javascript django function url dynamic-url


【解决方案1】:

如果你的模板中有卡片对象,试试这个:

<a id="edit-button" class="btn btn-default btn-warning" href="{% url 'flash-edit' card.id %}"  >Edit</a>

【讨论】:

  • 很遗憾,我无法访问模板中的卡片对象
  • 在你的createDynamicURL你怎么设置cardID
  • 它来自我的 js 文件的不同部分
  • 无论如何,你可以在你的视图中获取card,并在模板中使用它。虽然,当您在 javascript 中设置 cardID 时,这意味着您可以在模板中使用它。
  • 能否详细说明我应该如何在模板中使用cardID
猜你喜欢
  • 2020-02-11
  • 2020-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多