0

スキルを入力できるユーザープロファイルを設定しようとしています。スキルを入力し、それらをdatabseに保存すると、すでに動作します。今私は、ボタンのクリックでそれらのすべてのものを削除する機会をユーザに与えたいと思う。私は各スキルのIDを投稿してURLのボタンをクリックして、アイテムを取得して削除するために私の見解でそれを読んだが、それは思ったように機能しません。 MY VIEWDjango - ボタンクリックで単一のデータベースエントリを削除するにはどうすればよいですか?

def profile_settings(request, id=None): 
# get logged in user object from session 
user_id = request.user.id 
# get related userprofile 
userprofile = UserProfile.objects.get(pk=user_id) 
# get all skills of the userprofile 
user_skills = Skill.objects.filter(user=userprofile) 

if request.method == 'POST': 

    form = SkillForm(request.POST) 

    if 'delete-skill' in request.POST: 
      if id: 
       print(id) 
       skill = Skill.objects.get(pk=id).delete() 

    elif 'add-skill' in request.POST: 
     if form.is_valid(): 
      # get data from form 
      name = form.cleaned_data['name'] 
      category = form.cleaned_data['category'] 
      rating = form.cleaned_data['rating'] 
      # create new skill object for a user 
      new_skill = Skill(name=name, category=category, rating=rating, user=userprofile) 
      # save it in the database 
      new_skill.save() 

else: 
    form = SkillForm() 
return render(request, 'profile-settings.html', {'skillform': form, 'existing_skills': user_skills}) 

MYのURL

urlpatterns = [ 
    url(r'^landing', views.landing, name='landing'), 
    url(r'^neuigkeiten', views.news, name='news'), 
    url(r'^profileinstellungen/', views.profile_settings, name='profileinstellungen'), 
    url(r'^profileinstellungen/(?P<id>\d+)/$', views.profile_settings, name='profileinstellungen'), 
] 

MY TEMPLATE

{% extends 'base.html' %} 
 

 
{% block content %} 
 
    <form method="post" style="margin-top: 300px"> 
 
     {% csrf_token %} 
 
     {{ skillform }} 
 

 
     <input type="submit" value="Hinzufügen" name="add-skill "/> 
 

 
    </form> 
 

 
    <form method="post"> 
 
     {% csrf_token %} 
 
     <ul> 
 
      {% for skill in existing_skills %} 
 
       <li>{{ skill.name }}</li> 
 
       <input href="{% url 'profileinstellungen' id=skill.id%}" type="submit" value="Löschen" name="delete-skill"/> 
 
      {% endfor %} 
 
     </ul> 
 
    </form> 
 

 
{% endblock %}

これは、URL中のスキルのIDを投稿していません。別の方法がありますか?

+0

具体的なエラーはありますか? –

+0

よく削除ボタンをクリックすると、スキルのIDがURLに渡されないので、何も起こりません。 – Marco

答えて

0

あなたはURLパターンの正規表現の末尾にドル記号を含めるのを忘れてしまいました。それは次のようになります。

urlpatterns = [ 
    url(r'^landing$', views.landing, name='landing'), 
    url(r'^neuigkeiten$', views.news, name='news'), 
    url(r'^profileinstellungen/$', views.profile_settings, name='profileinstellungen'), 
    url(r'^profileinstellungen/(?P<id>\d+)/$', views.profile_settings, name='profileinstellungen'), 
] 

は特に、問題は、正規表現r'^profileinstellungen/です。ドルがなければ、/profileinstellungen/4/のようなURLと一致するので、IDはビューに渡されません。

第2に、入力にhref属性を与えることは意味がありません。各入力は別々のフォームにする必要があります。投稿アクションを送信するURLにフォームアクションを設定することができます。

<ul> 
    {% for skill in existing_skills %} 
    <form method="post" action="{% url 'profileinstellungen' id=skill.id%}"> 
     {% csrf_token %} 
     <li> 
     {{ skill.name }} 
     <input type="submit" value="Löschen" name="delete-skill"/> 
     </li> 
    </form> 
    {% endfor %} 
</ul> 
+0

しかし、それは私の問題を正しく解決しませんか? – Marco

+1

問題の内容を正確に説明していません。私の推測では、URLタグは機能していますが、間違ったURLパターンがURLに一致しています。その場合、私の答え*あなたの問題を解決します。 – Alasdair

+0

私の問題は次のとおりです:特定のスキルの削除ボタンをクリックすると、そのスキルのIDはURLに渡されず何も起こりません。 – Marco

0

この変更しよう: "URL" は "skill.id" を "ID"

に関連していたことを自動的に知ることができますので、

<input href="{% url 'profileinstellungen' %}{{skill.id}}" type="submit" value="Löschen" name="delete-skill"/> 

:このことにより

<input href="{% url 'profileinstellungen' id=skill.id%}" type="submit" value="Löschen" name="delete-skill"/> 

関連する問題