将 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>
<remove>
是“提交”。
模板如下所示:
% 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"> </label>
<input type="submit" value="Remove ►"></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"> </label>
<input type="submit" value="Remove ►"></li>
在request.POST
的for
循环中,您可以使用.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 模板变量作为输入参数传递的主要内容,如果未能解决你的问题,请参考以下文章