1

Ubuntu 12.04でPython 2.7でDjango 1.4を使用しています。

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

朝が早すぎたことがわかりました。

ビューのばかげた間違いに注意してください。

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 に答える
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 に答える