【问题标题】:Reverse for 'edit_team' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['club_home/edit_team/(?P<pk>[0-9]+)/$']使用关键字参数“{'pk': ''}' 的“edit_team”反向。尝试了 1 种模式:['club_home/edit_team/(?P<pk>[0-9]+)/$']
【发布时间】:2019-01-26 14:23:52
【问题描述】:

尝试创建页面以使用序列化程序更新我的模型时收到上述错误。无法在 edit_team 视图中使用 pk。有什么想法我哪里出错了吗?删除按钮与 pk 工作正常,不知道为什么更新不是。

urls.py

path('teams/', views.TeamInfo.as_view(), name='teams'),
path('delete_team/<int:pk>/', views.delete_team, name='delete_team'),
path('edit_team/<int:pk>/', views.edit_team, name='edit_team'),

teams.html

<div class="team">
<h3>Team Details</h3>
<p>
    {% csrf_token %}
    {% for info in teams %}
<li>{{ info.club_id }}</li>
<li>{{ info.team_name }}</li>
<li>{{ info.manager_name }}</li>
<form action="{% url 'clubs:delete_team' info.pk %}">
<input type="submit" value="Delete">
</form>
<form action="{% url 'clubs:edit_team' info.pk %}">
<input type="submit" value="Edit">   

edit_team.html

{% extends 'club_main_page.html' %}
{% load rest_framework %}
{% load staticfiles %}
{% block body_block %}

<div class="editteam">
  <h3>Edit Team</h3>
<form action="{% url 'clubs:edit_team' pk=instance.pk %}" method="POST">
      {% csrf_token %}
     {% render_form serializer %}
<input type="submit" name="" value="Update">
</form>

</div>
{% endblock %}

views.py

def delete_team(request, pk):
    team = Team.objects.filter(pk=pk)
    team.delete()
    return redirect('clubs:teams')


def edit_team(request, pk):
    instance = Team.objects.filter(pk=pk)
    if request.method == 'POST':
        serializer = TeamSerializer(request.POST, instance=instance)
        if serializer.is_valid():
            serializer.save()
            return redirect('/')
        else:
            return redirect('/')
    else:
        serializer = TeamSerializer(instance=instance)
        return render(request, 'edit_team.html', {'serializer': serializer})

引用:edit_pitch 中的 \clubkit\clubs\views.py return render(request, 'edit_pitch.html', {'serializer': serializer})

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    在您的模板中编写:

    &lt;form action="{% url 'clubs:edit_team' pk=<b>instance.pk</b> %}" method="POST"&gt;

    但是没有 instance 变量,你传递给渲染进程,所以你也应该添加这个,所以:

    def edit_team(request, pk):
        instance = Team.objects.filter(pk=pk)
        if request.method == 'POST':
            serializer = TeamSerializer(request.POST, instance=instance)
            if serializer.is_valid():
                serializer.save()
                return redirect('/')
            else:
                return redirect('/')
        else:
            serializer = TeamSerializer(instance=instance)
            return render(
                request,
                'edit_team.html',
                {'serializer': serializer, 'instance': instance})

    但我不确定,如果重定向到 / 是个好主意,如果 serializernot 有效,肯定不是。在这种情况下,人们通常希望再次呈现页面,但出现错误。因此,make use of forms [Django-doc] 可能也是一个更好的主意。

    【讨论】:

    • 嗨,Willem,我试过了,但仍然收到同样的错误。感谢您对重定向的反馈,只是为了让它首先工作。最好使用表单来完成此操作,就像让它与序列化程序一起使用,因为我已经知道如何使用表单来完成它。只是想学点新东西。
    【解决方案2】:

    您没有将 PK 传递给模板,因此它不能用于在那里生成 URL。更改视图的最后一行:

    return render(request, 'edit_team.html', {''pk': pk, serializer': serializer})
    

    【讨论】:

    • 嗨丹尼尔,如果我添加这个,我将如何将它应用到我的表单中:
      {% csrf_token %} {% render_form 序列化程序 %}
    【解决方案3】:

    本可以使用序列化程序来解决这个问题。但只是在此处使用表单解决方案,以防万一有人需要它:

    def edit_team(request, pk):
    instance = Team.objects.filter(pk=pk).first()
    if request.method == 'POST':
        form = TeamForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()
            return redirect('clubs:teams')
        else:
            return redirect('clubs:teams')
    else:
        form = TeamForm(instance=instance)
        return render(request, 'edit_team.html', {'form': form,
                                                  'instance': instance})
    

    然后在模板中:

    {% extends 'club_main_page.html' %}
    
    {% block head %}
    <title>Edit Pitch</title>
    {% endblock %}
    
    {% block body_block %}
    
    <div class="container">
    <form method="post">
        {% csrf_token %}
        {{ form.as_p}}
        <button type="submit">Submit</button>
    </form>
    
    </div>
    
    {% endblock %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-07
      • 2020-05-13
      • 2021-08-10
      • 1970-01-01
      • 2019-02-07
      • 2019-11-18
      • 2022-01-13
      • 2020-04-17
      相关资源
      最近更新 更多