六.3--客户展示之编辑,新增客户的功能整合

但是如下图中新增客户和编辑客户视图重复内容太多了,所以我想做一个整合成一个视图。否则到时候要改代码的话要改很多,不方便。

六.3--客户展示之编辑,新增客户的功能整合_第1张图片

 (1)crm/urls.py中:两个url对应一个视图函数---一个url传参数一个不传,那这个时候就可在views.py中用默认值

from django.conf.urls import url,include
from crm import views
urlpatterns = [
url(r'^customer_list/',views.customer_list,name='customer'),
# 增加客户---这个不会传参数
url(r'customer/add/', views.customer, name='add_customer'),
# 编辑客户---这个要传参数
url(r'customer/edit/(\d+)', views.customer, name='edit_customer'),
]

(2)views.py中:把此前的增加客户def add_customer(request)和编辑客户def edit_customer(request, edit_id)函数删除合并成如下函数:

# 新增和编辑客户

def customer(request, edit_id=None):#一个url传参数一个不传,那这个时候就用默认值edit_id=None即没有参数就是空的,有就传
    obj = models.Customer.objects.filter(id=edit_id).first()
form_obj = CustomerForm(instance=obj)
if request.method == 'POST':
form_obj = CustomerForm(request.POST, instance=obj)
if form_obj.is_valid():
form_obj.save()
return redirect(reverse('customer'))

return render(request, 'crm/customer.html', {"form_obj": form_obj, "edit_id": edit_id})

(3)templates/crm/customer.html中:判断有无客户id

{% extends 'layout.html' %}
{% block content %}



{% if edit_id %} #有客户id
编辑客户
{% else %} #无客户id
新增客户
{% endif %}








{% csrf_token %}
{% for field in form_obj %}





{{ field }}

{{ field.errors.0 }}




{% endfor %}













{% endblock %}

这样就实现了一个视图函数就同时实现新增和编辑客户的功能了。

2.整合流程总结:

(1)客户列表页面中点击添加按钮-------走------->urls.py中customer/add/这个url(但因为还没有客户所以无客户id即无id参数)---走----->views.py中customer函数--(-看没传客户id,所以为默认none空)---,那obj客户对象也为空,那form对象form_obj也为空---传回模版---->那return render(request, 'crm/customer.html',{"form_obj": form_obj, "edit_id": edit_id})----->edit_id客户id拿到的也是空,customer.html模版渲染出的input框也没数据。这是get请求。此时我们填数据并提交,就变成post请求,校验数据后就创建了新客户.

六.3--客户展示之编辑,新增客户的功能整合_第2张图片

 

 (2)点击编辑----走--->urls.py中customer/edit/(\d+)这个url(一看有客户id参数)----走-->views.py中customer函数(一看有拿到客户参数id),那obj客户对象就能查到form对象了,那customer.html就循环渲染input框,这是get请求。此时你改客户数据并点击提交就是post请求了。

六.3--客户展示之编辑,新增客户的功能整合_第3张图片

 

 怎么区分是新增还是编辑?----看有没有客户id参数传,有就是编辑,无就是新增。

这样一个视图函数就解决了四个功能:

..新建客户

  先获取新建客户页面

  提交时post请求

...编辑客户:

  先获取编辑客户页面

  提交时post请求

你可能感兴趣的:(六.3--客户展示之编辑,新增客户的功能整合)