【问题标题】:Django - How do I delete single database entries on button click?Django - 如何在单击按钮时删除单个数据库条目?
【发布时间】:2016-07-18 13:05:22
【问题描述】:

我正在尝试设置一个用户个人资料,您可以在其中输入技能。输入技能并将它们保存在数据库中已经可以了。现在我想让用户有机会通过单击按钮删除其中的每一个。我尝试在 URL 中单击按钮时发布每个技能的 ID,并在我的视图中读出它以获取该项目并将其删除,但这并不像我想的那样工作,我无法找出原因......

我的看法

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

我的网址

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

我的模板

{% 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。有其他方法吗?

【问题讨论】:

  • 您是否遇到任何具体错误。
  • 好吧,当我点击删除按钮时,技能的 ID 没有在 url 中传递,所以什么也没有发生......

标签: python django django-models django-templates django-views


【解决方案1】:

尝试改变这一点:

<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”相关

【讨论】:

    【解决方案2】:

    您忘记在 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。

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

    【讨论】:

    • 您没有准确解释您的问题是什么。我的猜测是 URL 标记正在工作,但错误的 URL 模式与 URL 匹配。如果是这样,那么我的回答解决您的问题。
    • 我的问题如下:当我点击某个技能的删除按钮时,该技能的 id 没有传递到 URL 并且没有任何反应。
    • @Alasdair 是对的。因为您没有收到任何错误,所以它可能与另一个 URL 匹配。否则,您将面临反向 URL 错误或类似情况。
    • 好的,但我看不出我的错误在哪里。我已经改变了我的 URL confs,就像 Alasdair 说的那样,但是 ID 并没有出现在 URL 中:(
    • 您正在使用 POST 方法提交表单。如果要在 URL 中发送 ID,则需要将 METHOD 从 POST 更改为 GET。 GET 用于在 URL 中发送参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 2020-04-16
    • 1970-01-01
    • 2018-06-08
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多