urls.py的CRUD模式,将对象从URI传递到视图

时间:2009-08-30 21:31:37

标签: django view generics crud

可以查找对象值并将其传递给通用视图吗?是否需要将通用视图移动到views.py以支持对象查找?

urls.py

urlpatterns = patterns('myapp.views',
        url(r'^mymodel/create/$', view='mymodel_create',  name='mymodel_create'),
)

urlpatterns += patterns('django.views.generic',
        url(r'^(?P<model>\w+)/create/$','create_update.create_object', name='object_create'),
        url(r'^(?P<model>\w+)/(?P<id>\d+)/update/$', 'create_update.update_object', name='object_update' ),
        url(r'^(?P<model>\w+)/(?P<id>\d+)/delete/$', 'create_update.delete_object', name='object_delete'),        url(r'^(?P<model>\w+)/(?P<object_id>\d+)/$', 'list_detail.object_detail',  name='object_detail'),
        url(r'^(?P<model>\w+)/$','list_detail.object_list', name='object_list'),'
)

示例网址:

http://localhost/myapp/thing/create
http://localhost/myapp/thing/1
http://localhost/myapp/thing/1/update
http://localhost/myapp/thing/1/delete

我想使用(?P \ w +)来查找相应的Model,'Thing',但是当执行此代码时,会发生以下错误:object_list()得到一个意外的关键字参数'model'

2 个答案:

答案 0 :(得分:4)

是的,你可以做到这一点,我已经做到了。 Django通用视图不直接支持它。您需要使用自己的视图包装通用视图,以查找模型并构造查询集。这是一个示例(仅显示详细视图,您可以类似地执行其他操作)。我已经在URLconf中更改了你的命名模式,使用“model”而不是“object”,这更明确的命名:

在urls.py中

url(r'^(?P<model>\w+)/(?P<object_id>\d+)/$', 'my_app.views.my_object_detail',  name='object_detail'),

在my_app / views.py

from django.views.generic.list_detail import object_detail
from django.db.models.loading import get_model
from django.http import Http404

def get_model_or_404(app, model):
    model = get_model(app, model)
    if model is None:
        raise Http404
    return model

def my_object_detail(request, model, object_id):
    model_class = get_model_or_404('my_app', model)
    queryset = model_class.objects.all()
    return object_detail(request, queryset, object_id=object_id)

如果你很聪明并希望尽可能保持DRY,你可以创建一个单独的包装器,它接受通用视图函数作为其参数之一调用,而不是使用create的包装器,一个更新的包装器等等。

答案 1 :(得分:1)

我认为您可能对通用视图的设计方式感到有些困惑。例如,如果你去阅读django.views.generic.list_detail,你会发现object_list和object_detail都不接受“object”参数,但两者都需要一个“queryset”参数。您不需要“找到相应的模型” - 两个通用视图都是呈现提供的查询集的常用方法(在object_detail的情况下,在被object_id或slug和slug_field过滤之后)。我不是完全确定你想要做什么,但我不认为这些通用视图是你正在寻找的。