我正在使用Django通用视图。出于某些原因,我不允许使用其他Rest Framework(例如Tastypie)来处理rest API。
我想看看我是否可以使用可以处理CRUD http方法的通用视图。
有人能指点我一个例子吗?
到目前为止,我的网址是这样的:
url(r'^user/$', views.UserView.as_view(), name='user'),
我不确定一个url如何处理所有CRUD方法。
感谢。
答案 0 :(得分:0)
这是一个如何完成它的例子,它实际上取决于你的要求,因为你没有提供任何我只会谈论我的用例而不是EXTJS。
这是url.py,动作是' c'用于创造和' d'删除。 objtype是模型的名称,app是可以找到模型的应用程序(您可能不需要)。
url(r'^model_json/(?P<action>[a-z]+)/(?P<objtype>[A-Za-z0-9-_]+)', 'jsonhelper.views.flatdata_cud', {'ext':True,'app':rhinomodels }, name = 'model_cud_json'),
来自EXTjs的URL会将此视为创建新用户。因此,用户详细信息将作为json数据发布,该数据在HTTP POST中可用。 127.0.0.1:8000/model_json/c/User
这是我的代码。 get_fk_model是一个内部函数,它将返回fk对象的关联模型,如果它不是fk类型,则返回None。
import json
@login_required
@csrf_exempt
def flatdata_cud(request, objtype, action, id = None, idfield = None, follow_related = False, app = None):
""" Implements the Create Update and Delete functions for ExtJS data store porxy's """
djmodel = getattr(app, objtype)
if not djmodel:
return errorMsg("Model not found, %s"%(objtype))
if request.method != 'POST':
return errorMsg("Must be a post action, %s"%(request.method))
data = json.loads(request.body)
if type(data) == dict:
data = [data,]
kwargs = {}
id_list = []
def check_value(data):
for k in data:
fkmodel = get_fk_model(djmodel, k)
if fkmodel: # we have a ForeignKey, change value to be an object of this type
data[k] = fkmodel.objects.get(id = data[k] )
return data
for d in data:
d = check_value(d)
id = None
if action == 'c':
rec = djmodel()
if d.has_key('id'): d.pop('id')
else:
id = d.pop('id')
rec = djmodel.objects.get(id = id)
if action == 'd':
rec.delete()
else:
for i in d.keys():
setattr(rec, i, d[i])
rec.save()
id_list.append( id if id else rec.id )
kwargs['id__in'] = id_list
return flatdata(request, objtype, id = id, idfield = idfield, follow_related = follow_related, add_filter = kwargs, app = app)
作为最后一步,我返回flatdata,返回EXTjs一个新的json对象,了解对象在更新后的样子。