1

我在 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">&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 = '{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.

建议?

4

3 回答 3

1

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

PS:我还建议使用django-debug-toolbar和 Python 本机日志记录模块进行调试。

于 2012-10-21T13:43:07.097 回答
0

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

   <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>

for循环中,request.POST您可以使用.split("_")[-1].

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

于 2012-10-21T12:58:40.037 回答
0

事实证明,早上还为时过早。

注意视图中的愚蠢错误:

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

显然,这需要:

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

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

问题解决了。

于 2012-10-21T13:38:19.350 回答