【问题标题】:Trouble passing vote variable to js - I'm not using forms, POST, or django-voting将投票变量传递给 js 时遇到问题 - 我没有使用表单、POST 或 django-voting
【发布时间】:2014-04-18 15:29:17
【问题描述】:

我有一个简单的输入和显示系统,用于在单个网页上输入短文本。文本输入只是一个在视图中带有 GET 的输入字段。我想在页面上为最新条目提供一个非常基本的向上或向下投票系统。我可以将最新条目放入变量中...

网上有人暗示可以将变量传递给js,这是我的第一个停靠点。

我还没有使用过表单或 POST,因为它似乎包含对我的基本需求而言不必要的 url 和代码。谁能告诉我如何将变量传递给 js?

这是一些sn-ps的代码;

模板

<script type="text/javascript"> 
{% for entry in voting_entry %}
    var votingEntry="{{entry.id}}"         
    {% endfor %}     
</script>

<script type="text/javascript" src="{{STATIC_URL}}vote.js"></script>

vote.js

$(document).ready(function() {

$("#votingEntry").bind("keypress", function(e) {

    if (e.keyCode == 38) {
        var vote = $("#votingEntry").val();     
        var args = {'vote':vote};           
        $.get("/vote/", args).done(function(data) {
        location.reload();  
      });
    }   
  });

观看次数

def index(request):
  context = {
  'latest_entry_list': Entry.objects.order_by('-pub_date')[:10],
  'high_entry_list': Entry.objects.order_by('-score')[:10],
  'low_entry_list': Entry.objects.order_by('score')[:10],
  'voting_entry': Entry.objects.order_by('-pub_date')[:1],
  }
   return render(request, 'entries/index.html', context);

*snip*

def vote(request):
  voting_id = request.GET.get('vote')
  v = Entry.objects.get(pk='voting_id')
  v.score +=1
  v.save()       
  return HttpResponse('votedone')

【问题讨论】:

    标签: javascript django vote


    【解决方案1】:

    目前还不清楚您要做什么。在第一个 sn-p 中,您反复将相同的变量 votingEntry 设置为包含列表中 ID 的字符串。由于您每次都设置了相同的变量,因此 var 将仅以列表中的最后一个值结束。

    另外,要在JS中在函数之外设置全局变量,你需要var关键字。

    但是,我不太确定您为什么要这样做,因为您没有在 JS 的其他任何地方使用 votingEntry 变量。您需要提供更多关于您希望实现的目标的详细信息。

    【讨论】:

    • 谢谢丹尼尔,....你的困惑是因为我真的不知道我在做什么。我希望实现的是让用户对呈现给他们的文本对象(最新输入的)进行投票。所有的文本都被输入到一个 sqlite3 数据库中,其中输入了文本、分数和日期。所有这些代码都可以正常工作。我只是想在此基础上做一个简单的投票系统。 django 和 js 中的其他投票示例似乎过于复杂,所以我试图保持简单,并在我按下一个键(向上箭头)时将最新的 id 传递给视图以更改分数。这有意义吗?
    • 嗨 - 编辑已经澄清我没有在模板中设置一个以上的变量......虽然不知道你对这个位的意思; “另外,要在 JS 的函数外设置全局变量,需要 var 关键字。”
    • 没有人指出这一点,但首先将模板代码更改为这个; 我会告诉你如果我设法得到它工作......
    • 您仍在循环中一遍又一遍地设置相同的变量。并且您需要使用 JavaScript var 关键字。
    • 谢谢,其实我也改了。更新了上面的模板。仍然没有运气.................................至于在循环中一遍又一遍地设置变量; voting_entry_list 只有一个值(在视图中),并且根据最新条目进行更新,因此 for 循环会检查该值,除非您有建议...... ........无论哪种方式,该值仍然没有通过。我应该传递值的代码,还是它被破坏了?
    【解决方案2】:

    使用模板中的一个非常简单的表单对其进行排序。提交按钮通过 url 触发 views.vote 函数,views.vote 检测 up 或 down 按钮名称,并将投票保存到 entryid 引用的条目。这是由模板表单中隐藏名称上的 POST.get 引入的。

    最后,重定向将所有内容保留在一个页面上并刷新索引。

    模板

    <ul>
    {% for entry in voting_entry_list %}
        <li><a href="/entries/{{ entry.id }}/">{{ entry.text }}{{ entry.score }}</a></li>
        <li><form method="POST" action="/vote/" >
        {% csrf_token %}
          <input type="hidden" name="voteid" value="{{ entry.id }}" />
          <input type="submit" name='voteup' value="Up" />
          <input type="submit" name='votedown' value="Down" />
        </form><li>  
    {% endfor %}  
    </ul> 
    

    网址

    urlpatterns = patterns('',
      url(r'^admin/', include(admin.site.urls)),
      url(r'^index/$', 'entries.views.index'),
      url(r'^add/$', 'entries.views.add'),
      url(r'^vote/$', 'entries.views.vote')
    )
    

    观看次数

    @csrf_protect  
    def vote(request):
     voting_id = request.POST.get('voteid',None)
     if request.method=='POST':
       if 'voteup' in request.POST:
         v = Entry.objects.get(pk=voting_id)
         v.score +=1
         v.save()
       if 'votedown' in request.POST:
         v = Entry.objects.get(pk=voting_id)
         v.score -=1
         v.save()
     else:
        pass
     return HttpResponseRedirect('/index')
    

    我的最后一个问题是必须去掉 - pk=voting_id 的引号 - 以防止出现“invalid literal for int() with base 10”的错误。

    希望这可以帮助那些只想以基本方式开始使用这些系统的人,但与 django polls 教程不太一样。尝试各种方法(JSON、js、POST、表单、正则表达式、url 等)有点困难,所以这是我使用许多 SO 问题中的各种 sn-ps 的方法。

    【讨论】:

      猜你喜欢
      • 2010-10-07
      • 1970-01-01
      • 2019-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多