出现了意外的关键字参数“ id”

时间:2020-06-23 22:24:42

标签: django django-forms django-views django-templates

当对象的状态为“打开”时,我正在尝试查询。并显示在一个表中,在该表中,我将有一个按钮可以为表单提供解决方案,并将status更改为“ Pending”。但是,当我单击按钮时,会出现此错误。

我真正想要做的是显示每个数据的表单,但是当我为数据insnt显示的每个表单做一个for循环时,如何看到我的editable.html 。我只要按一下按钮即可执行操作,它们就可以正常工作。

Editale.html

url:

 path('manutencao_os_status/<int:id>', views.manutencao_ordem_de_servico, name='manutencao_os_status'),
    path('manutencao_ordem_de_servico/', views.manutencao_ordem_de_servico, name='manutencao_ordem_de_servico'),

views.py

def manutencao_ordem_de_servico(request):
    ordem_servico = OrdemServico.objects.filter(status='Aberto').order_by('id')
    form = FormOrdemServico(ordem_servico)

    if request.method != 'POST':
        return render(request, 'ordemservico/manutencao_ordem_de_servico.html', {
            'form': form,
            'ordem_servico': ordem_servico
        })

    form = FormOrdemServico(request.POST, ordem_servico)

    if not form.is_valid():
        return render(request, 'ordemservico/manutencao_ordem_de_servico.html', {
            'form': form,
            'ordem_servico': ordem_servico
        })

    ordem_servico.save()

    return redirect('ordemservico:manutencao_ordem_de_servico')


def manutencao_os_status(request, id):
    ordem_servico = OrdemServico.objects.get(pk=id)
    ordem_servico.status = 'Em Aprovação'

    ordem_servico.save()

    return redirect('ordemservico:manutencao_os_status')

html:

 {%extends 'base.html' %}
    
    {%block conteudo %}
    <h1>Ordens de Serviço</h1>
    
    <section class="content">
        <div class="container-fluid">
            <div class="row">
                <div class="card card-primary">
                    <div class="table table-bordered">
    
                        <table class="table table-bordered">
                            <thead>
                            <tr>
                                <td>Condition:</td>
                                <td>ID:</td>
                                <td>Name:</td>
                                <td>Status:</td>
                                <td>Solution:</td>
                            </tr>
                            </thead>
                            <tbody>
                            {% for os in ordem_servico %}
                            <tr>
                                <td>
                               <a href="{% url 'ordemservico:manutencao_os_status' os.id %}"
                               class="btn btn-success">Aprovar</a>
                                </td>
                                <td>{{os.id}}</td>
                                <td><a href="{% url 'ordemservico:editar_ordem_de_servico' os.id %}"> {{os.name}}</a></td>
                               
                                <td>{{os.status}}</td>
                                
                                <td>{{os.solution}}</td>
    
                            </tr>
                            {%endfor%}
                            </tbody>
                        </table>
        
        
                        </div>
                    </div>
                </div>
            </div>
        </section>
        
        {% endblock %}

我的editable.html:

{%for os in ordem_servico %}
<form action="{% url 'ordemservico:manutencao_os_status' os.id  %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <fieldset>
        <legend><h2>Ordens de Serviço</h2></legend>
        <table class="table">
            {{ os.form }}
            <tr>
                <td colspan="2">
                    <button type="submit" class="btn btn-primary">Solucionar</button>
                </td>
            </tr>

        </table>

    </fieldset>
</form>
{%endfor%}
{% endblock %}

1 个答案:

答案 0 :(得分:1)

您转到了错误的视图,应该是:

path(
    'manutencao_os_status/<int:id>',
    views.manutencao_os_status,
    name='manutencao_os_status'
),

在该视图中,您应该重定向到manutencao_ordem_de_servico视图:

def manutencao_os_status(request, id):
    ordem_servico = OrdemServico.objects.filter(pk=id).update(
        status='Em Aprovação'
    )
    return redirect('ordemservico:manutencao_ordem_de_servico')

注意:一个GET请求不是没有具有副作用,因此正在更新 用户发出GET请求时与HTTP不兼容的对象 标准。因此,最好使用POST请求更新OrdemServico