将 DJango 模板变量作为输入参数传递

Posted

技术标签:

【中文标题】将 DJango 模板变量作为输入参数传递【英文标题】:Passing DJango template variable as an input parameter 【发布时间】:2012-10-11 11:12:38 【问题描述】:

我在 Ubuntu 12.04 上使用 Django 1.4 和 Python 2.7。

我有一个模板,它使用 Django 的模板语法来生成对象列表。我想在每个项目上创建一个“表单帖子”,以提供从列表中删除该项目的选项。很简单:

mysql <remove> 
Linux <remove>  
Java   <remove>
Python   <remove>
C++   <remove>
PostgreSQL   <remove>
Django <remove>

&lt;remove&gt; 是“提交”。

模板如下所示:

% if not dev.user.is_superuser %
    % if dev.user.is_authenticated and dev.user.is_staff %
       <ul>
       % for skill in dev.skill_set.all %
           <form action="/removeSkill/" method="post">% csrf_token %
           <li>
                skill.skill 
               <input type="hidden" name="skill" value= skill.skill >
               <label class="formlabel">&nbsp;</label>
               <input type="submit" value="Remove  &#9658;"></li>
           </form>
       % endfor %
       </ul>
    % endif %

我需要知道如何将 skill.skill 值作为隐藏输入的value 传递。

有什么建议吗?

更新 1:

好的,看起来我在模板中所做的工作非常出色。我似乎无法真正从视图中的数据库中删除条目。

def remove_skill(request):
    """
    ..  function:: remove_skill()

        Remove a skill for a developer

        :param request: Django Request object
    """
    ## Create a logging object
    path = os.path.join(os.path.dirname(__file__), 'logs/')
    filename = '0debug.log'.format(path)
    logfile = open(filename, 'w')
    now = datetime.datetime.now()
    logfile.write('\n --------------------- 0\n'.format(now))
    if (request.user.is_authenticated() and request.user.is_staff):
        userProfile = UserProfile.objects.get(user_id = request.user.id)
        devSkills = DevSkills(dev = userProfile, skill = request.POST.get('skill'))
        logfile.write('user =  0\n'.format(devSkills.dev_id))
        logfile.write('skill to remove =  0\n'.format(devSkills.skill))
        devSkills.delete()
        logfile.close()

    return dev_profile(request)

debug.log 文件显示了正确条目的信息,但是当我尝试删除技能时,我仍然收到以下错误:

DevSkills object can't be deleted because its id attribute is set to None.

建议?

【问题讨论】:

【参考方案1】:

以下是您要查找的内容吗(基于视图中的“名称”参数解析)?

   <li>  skill.skill  
        <input type="hidden" name="skill_ skill.pk " value= skill.skill > 
        <label class="formlabel">&nbsp;</label>
        <input type="submit" value="Remove  &#9658;"></li>

request.POSTfor 循环中,您可以使用.split("_")[-1] 轻松解析。

这不是太优雅。使用 formsets (https://docs.djangoproject.com/en/dev/topics/forms/formsets/) 实际上可能是您正在寻找的。

【讨论】:

我会尝试使用formsets,但看起来我需要进行一些重构才能正确使用它——对于这样一个简单的概念来说,它似乎过于复杂。感谢您的帮助。 在这种情况下修改“名称”参数对您有用吗? -- 实际上使用_skill.id 可能会更好。 我实际上确定我正在做的是传递我想要的信息 - 我似乎无法正确删除数据库中的条目。我会更新我的问题。【参考方案2】:

原来是早上太早了。

注意视图中的愚蠢错误:

devSkills = DevSkills(dev = userProfile, skill = request.POST.get('skill')

显然需要:

devSkills = DevSkills.objects.get(dev = userProfile, skill = request.POST.get('skill'))

我需要删除一个对象——而不是创建一个!

问题解决了。

【讨论】:

【参考方案3】:

似乎是devSkills = DevSkills(...) 字符串中的错字。您实际上是在实例化新对象,而不是从数据库中获取记录。您需要使用devSkills = DevSkills.objects.filter(...) 获取查询集,然后使用delete 获取它。

PS:我还建议使用 django-debug-toolbar 和 Python 原生 logging module 进行调试。

【讨论】:

感谢您的建议,我会研究这两个工具。关于您的解决方案-是的,这正是我想出的(以及我在解决方案中发布的内容:))。

以上是关于将 DJango 模板变量作为输入参数传递的主要内容,如果未能解决你的问题,请参考以下文章

无法将参数从模板传递到 Django 视图

如何将javascript变量传递给django模板标签

使用 jquery 将模板变量传递给 django url

如何将对象参数作为哈希表传递给 json arm 模板?

django - 将参数从模板传递到 models.py 的函数

在 django 模板 URL 标签中传递参数