2012-10-21 45 views
1

我在Ubuntu 12.04上使用Python 2.7的Django 1.4。傳遞DJango模板變量作爲輸入參數

我有一個使用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. 

建議?

回答

0

事實證明,這只是在早晨。

請注意,在視圖中的愚蠢的錯誤:

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

其中,顯然,需要的是:

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

我需要得到一個對象刪除 - 不能創建一個!

問題解決。

0

以下是你在找什麼(根據'name'參數進行解析)?

<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/)實際上可能是你要找的。

+0

我會嘗試使用'formsets',但看起來我需要做一點重構才能正確使用它 - 對於這樣一個簡單的概念來說,它似乎過於複雜。謝謝您的幫助。 – Rico

+0

在這種情況下會修改'name'參數嗎? - 實際上使用'_ {{skill.id}}'可能會更好。 – Williams

+0

我確定我正在做的是傳遞我想要的信息 - 我似乎無法正確刪除數據庫中的條目。我會更新我的問題。 – Rico

1

看起來像在devSkills = DevSkills(...)字符串中的錯字。你實際上是實例化新對象,而不是從數據庫獲取記錄。您需要使用devSkills = DevSkills.objects.filter(...)來獲取查詢集,然後使用delete它。 PS:我也建議使用django-debug-toolbar和Python原生logging module進行調試。

+0

感謝您的建議,我會研究這兩種工具。關於你的解決方案 - 是的,這正是我想到的(以及我在解決方案中發佈的內容:))。 – Rico