0

기술을 입력 할 수있는 사용자 프로필을 설정하려고합니다. 스킬을 입력하고 데이터베이스에 저장하면 이미 작동합니다. 이제 버튼 클릭만으로 모든 사용자를 삭제할 수있는 기회를 제공하고 싶습니다. 나는 각 스킬의 ID를 URL에 클릭하여 올리려고 시도했는데 항목을 가져 와서 삭제하기 위해 내보기에서 읽었지 만 생각대로 작동하지 않고 이유를 찾지 못했습니다.Django - 버튼 클릭시 단일 데이터베이스 항목을 어떻게 삭제합니까?

MY VIEW

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 템플릿

{% 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는보기로 전달되지 않습니다.

두 번째로 입력에 href 속성을 지정하는 것은 의미가 없습니다. 각 입력은 별도의 양식이어야하며 양식 요청을 제출하려는 URL로 양식 작업을 설정할 수 있습니다. 이것에 의해

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

:

<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

봅니다이 변경

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

은 "URL"은 "skill.id"관련이 있음을 자동으로 알 수 있기 때문에 "ID"

관련 문제