2015-12-06 80 views
0

我想我的模板标签被调用时,我不希望它们被调用,但我找不到任何修补程序。这是我在HTML:问题与Django中的自定义模板标签?

{% load cTemplateTags %} 
    {% if n.priority == 1 %} 
     {% if not n.read %} 

     <li> 
      <div class="alert alert-dismissible alert-warning"> 
       <button type="button" class="close" data-dismiss="alert" onclick="{% set n = True %}">x</button> 
       <a href="{{n.url}}" class="alert-link"> {{n.message}}</a> 
      </div> 
     </li> 
     {% endif %} 

    {% endif %} 

在我的模板标签:

from django import template 
from notifications.models import Notification 
register = template.Library() 


class SetVarNode(template.Node): 

    def __init__(self, var_name, var_value): 
     self.var_name = var_name 
     self.var_value = var_value 

    def render(self, context): 
     try: 
      value = template.Variable(self.var_value).resolve(context) 
     except template.VariableDoesNotExist: 
      value = "" 


     for n in Notification.objects.all(): 
      if n.actor == context[self.var_name].actor: 
       if n.message == context[self.var_name].message: 
        if n.priority == context[self.var_name].priority: 
         if n.date == context[self.var_name].date: 
          n.read = bool(self.var_value) 
          n.save() 


     return u"" 


@register.tag(name='set') 
def set_var(parser, token): 
    """ 
    {% set some_var = '123' %} 
    """ 

    parts = token.split_contents() 
    if len(parts) < 4: 
     raise template.TemplateSyntaxError("'set' tag must be of the form: {% set <var_name> = <var_value> %}") 

    print(token) 
    #print(parts[3]) 
    return SetVarNode(parts[1], parts[3]) 

反正让我在HTML只火onClick当按钮被实际点击?无论什么原因,当我重新加载页面时,即使我从未点击过按钮,该值也被设置为True。请让我知道你们是否可以想到任何事情!

回答

1

模板由服务器呈现。这意味着所有的标签在服务器上得到处理,然后生成一个简单的HTML页面发送给浏览器/客户端。

简而言之:

<button onClick="{% set n = True %}">x</button> 

将呈现给浏览器/客户端为:

<button onClick="True">x</button> 

UPDATE

因为,你想更新当点击一个按钮时异步的值为n.read您需要找到一种方法与服务器通信以更新n.read的值。

下面是使用jQuery库向服务器执行AJAX请求的最小示例。

<button id="myBtn" data-id="{{ n.id }}">x</button> 

<!-- JavaScript --> 
<!-- Don't forget to include jQuery --> 
<script> 
$("#myBtn").on('click', function(), { 
    var nId = $(this).attr('data-id'); 
    $.ajax({ 
     type: 'POST', 
     url: '/link/to/the/view/', 
     data: {'id': nId}, // this way server will know which object to update 
    }); 
}); 
</script> 

现在,将向服务器发出AJAX请求。您需要在服务器上实现一个视图,该视图负责更新和保存n对象。


更新2

您可以通过搜索的StackOverflow上使用Django和AJAX(jQuery的)多了很多例子。那么,你可以start here

+0

那么我将如何实施我的解决方案?有没有办法检查onClick是否属实? –

+0

@ColinFausnaught您可以提供一些关于您在模板中做什么的更多解释。你期待什么行为? – xyres

+0

@ColinFausnaught为了回应您的评论,'onClick'将始终为'True',因为您已在'{%set%}'标记中将它设置为'True',那么检查它的值有什么意义? – xyres

相关问题