我在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 = '{0}debug.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.
建议?
答案 0 :(得分:1)
似乎是devSkills = DevSkills(...)
字符串中的拼写错误。您实际上是在实例化新对象而不是从数据库中获取记录。您需要使用devSkills = DevSkills.objects.filter(...)
来获取查询集,然后使用delete
。
PS:我还建议使用django-debug-toolbar和Python原生logging module进行调试。
答案 1 :(得分:0)
以下是您要查找的内容(根据视图中的'name'参数进行解析)?
<li> {{ skill.skill }}
<input type="hidden" name="skill_{{ skill.pk }}" value={{ skill.skill }}>
<label class="formlabel"> </label>
<input type="submit" value="Remove ►"></li>
在for
request.POST
循环中,您可以使用.split("_")[-1]
轻松解析。
这不太优雅。使用formsets
(https://docs.djangoproject.com/en/dev/topics/forms/formsets/)实际上可能正是您正在寻找的。
答案 2 :(得分:0)
事实证明这是早上太早了。
注意视图中的愚蠢错误:
devSkills = DevSkills(dev = userProfile, skill = request.POST.get('skill')
显然,需要:
devSkills = DevSkills.objects.get(dev = userProfile, skill = request.POST.get('skill'))
我需要删除一个对象 - 不要创建一个!
问题解决了。