首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django表格员额导致404人

Django表格员额导致404人
EN

Stack Overflow用户
提问于 2020-09-16 20:13:13
回答 1查看 181关注 0票数 1

我试图为updatedelete接受一个表单,运行进程并返回更新的url或更新的对象列表。我已经运行了动态url大楼,但是当我点击submit时,我得到了一个404。我正在为如何处理这个帖子而挣扎,因为它在代码中似乎没有达到那么高的程度。代码如下:

urls.py

代码语言:javascript
复制
    path("customers/", views.customers, name="customers"),
    path("customers/customer/<int:id>/", views.customer),

forms.py

代码语言:javascript
复制
    class CustomerMaintForm(ModelForm):
        class Meta:
            model = AppCustomerCst
            fields = ('id_cst', 'is_active_cst', 'name_cst', 'address_1_cst', 'address_2_cst', 'address_3_cst',
                      'city_cst', 'state_cst', 'zip_cst', 'country_cst', 'salesrep_cst', 'type_cst',
                      'is_allowed_flat_cst', 'iddef_cst', 'date_created_cst', 'date_suspended_cst',
                      'date_first_tran_cst', 'date_last_tran_cst', 'is_credit_hold_cst',
                      'old_balance_cst', 'balance_notify_cst', 'balance_statement_cst',
                      'balance_conversion_cst', 'balance_cst', 'receive_emails_cst',
                      'contact_domain_cst'
                      )
            labels = {'id_cst': 'Customer ID', 'is_active_cst': 'Active?', 'name_cst': mark_safe('<p>Name'),
                      'address_1_cst': 'Address 1',
                      'address_2_cst': 'Address 2', 'address_3_cst': 'Address 3', 'city_cst': 'City', 'state_cst': 'State',
                      'zip_cst': 'Zip', 'country_cst': 'Country', 'salesrep_cst': 'Sales Rep', 'type_cst': 'Type',
                      'is_allowed_flat_cst': 'Allowed Flat?', 'iddef_cst': mark_safe('<p>Id'),
                      'date_created_cst': 'Created Date', 'date_suspended_cst': 'Suspended Date',
                      'date_first_tran_cst': 'First Tran Date', 'date_last_tran_cst': 'Last Tran Date',
                      'is_credit_hold_cst': 'Credit Hold?', 'old_balance_cst': 'Old Balance',
                      'balance_notify_cst': 'Balance Notify', 'balance_statement_cst': 'Balance Statement',
                      'balance_conversion_cst': 'Balance Conversion', 'balance_cst': 'Current Balance',
                      'receive_emails_cst': 'Receive Emails?', 'contact_domain_cst': mark_safe('<p>Contact Domain')}

views.py

代码语言:javascript
复制
def customer(request, id):
    if request.method == "GET":
        obj = AppCustomerCst.objects.get(id_cst=id)
        instance = get_object_or_404(AppCustomerCst, id_cst=id)
        form = CustomerMaintForm(request.POST or None, instance=instance)
        ContactFormSet = modelformset_factory(AppContactCnt, can_delete=True, fields=(
            'name_cnt', 'phone_cnt', 'email_cnt', 'note_cnt', 'receives_emails_cnt'))
        formset = ContactFormSet(queryset=AppContactCnt.objects.filter(idcst_cnt=id), prefix='contact')
        tpList = AppCustomerTpRel.objects.filter(idcst_rel=id).select_related('idcst_rel', 'idtrp_rel').values(
            'idtrp_rel__id_trp', 'idtrp_rel__tpid_trp', 'idtrp_rel__name_trp', 'sender_id_rel', 'category_rel',
            'cust_vendor_rel')
        TPFormSet = formset_factory(TPListForm, can_delete=True)
        tp_formset = TPFormSet(initial=tpList, prefix='tp')
        doc_list = DocData.objects.document_list(id)
        DocFormSet = formset_factory(DocumentListForm)
        DocFormSet = formset_factory(DocumentListForm)
        doc_formset = DocFormSet(initial=doc_list, prefix='doc')
        context = {'form': form, 'formset': formset, 'tp_formset': tp_formset, 'doc_formset': doc_formset, 'id': id}
        print(form.errors)
        return render(request, 'customer.html', context=context)

    elif '_edit' in request.POST:
        print(id, request.POST)
        cust_name = request.POST['name_cst']
        instance = get_object_or_404(AppCustomerCst, name_cst=cust_name)
        form = CustomerMaintForm(request.POST, instance=instance)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/customers/customer/{id}")
        else:
            context = {'form': form, 'contact_form': contact_form}
            return redirect(request, 'customer.html', context=context)

    elif '_delete' in request.POST:
        cust_name = request.POST['name_cst']
        instance = get_object_or_404(AppCustomerCst, name_cst=cust_name)
        form = CustomerMaintForm(request.POST, instance=instance)
        if form.is_valid():
            AppCustomerCst.objects.filter(id_cst=id).delete()
            return render(request, 'customers.html')

    else:
        pass

customer.html

代码语言:javascript
复制
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% url customer string %}
{% block content %}


<form method="post" action="/customer">
    {% csrf_token %}

    <div style="height:300px;overflow:auto;">
        {{ form }}
    </div>
    <input type="submit" value="Edit" name="_edit">
    <input type="submit" value="Delete" name="_delete">
</form>
{% endblock %}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-16 20:23:39

404是因为表单向POST发送一个/customer,您的URL是

  • /customers/
  • /customers/customer/<int:id>/

所以我首先给你的path加上一个名字,这样它就像path("customers/customer/<int:id>/", views.customer, name='customer')一样

然后将表单操作更改为使用django URL反转;

代码语言:javascript
复制
<form method="post" action="{% url 'customer' id=id %}">

通过这样做,它将根据您所使用的客户表单的ID为您生成URL,假设id位于视图代码中的上下文中。

这应该可以解决404问题,并改善一些情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63927343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档