3

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

网址.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() got an unexpected keyword argument 'model'

4

2 回答 2

4

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

在 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,您可以创建一个接受通用视图函数作为其参数之一调用的单个包装器,而不是使用用于创建的包装器、用于更新的包装器等。

于 2009-09-01T15:23:23.997 回答
1

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

于 2009-08-31T01:56:28.837 回答