0

Я пытаюсь настроить профиль пользователя, где вы можете вводить навыки. Ввод навыков и сохранение их в базе данных уже работает. Теперь я хочу дать пользователю возможность удалить каждый из них одним нажатием кнопки. Я попробовал опубликовать идентификатор каждого навыка при нажатии кнопки по URL-адресу и прочитать его на мой взгляд, чтобы получить элемент и удалить его, но это не работает, как я думал, и я не могу узнать, почему ...Django - Как удалить отдельные записи в базе данных при нажатии кнопки?

МОЙ ВЗГЛЯД

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

МОИ URLS

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'), 
] 

МОЙ 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. Есть ли альтернативный подход?

+0

Вы получаете какую-либо конкретную ошибку.? –

+0

Ну, когда я нажимаю кнопку удаления, идентификатор навыка не передается в 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/. Без доллара он совпадает с URL-адресами, такими как /profileinstellungen/4/, поэтому идентификатор не передается в представление.

Во-вторых, нет смысла вводить атрибут 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

Моя проблема заключается в следующем: когда я нажимаю кнопку удаления определенного навыка, идентификатор этого навыка не передается по URL-адресу, и ничего не происходит. – Marco

0

Попробуйте изменить:

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

этим:

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

, потому что "URL" будет автоматически знать, что "skill.id" был связан с "ID"