【问题标题】:CRUD pattern for urls.py, passing object from URI to viewurls.py 的 CRUD 模式,将对象从 URI 传递到视图
【发布时间】:2010-11-24 04:57:38
【问题描述】:

可以查找对象值并将其传递给通用视图吗?是否需要将通用视图移至 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() got an unexpected keyword argument 'model'

【问题讨论】:

  • 提到“对象值”是什么意思?
  • 我想用(?P\w+) 来查找对应的Model,但是执行这段代码时出现如下错误:object_list() got an unexpected keyword argument '对象'

标签: django view generics crud


【解决方案1】:

是的,你可以做到这一点,我已经做到了。 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,您可以创建一个单独的包装器,该包装器接受通用视图函数作为其参数之一进行调用,而不是使用用于创建的包装器、用于更新的包装器等。

【讨论】:

  • 感谢您让命名更清晰。我喜欢这种解决方案,但我不确定为什么不喜欢这种技术。
【解决方案2】:

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

【讨论】:

  • 如何将 放入查询集中? obj_dict = { 'queryset':object.objects.all(), }
  • 最终我尝试使用通用视图作为 CRUD,而不需要为模型中的每个对象编写相同的 CRUD 视图。我可以通过在视图中编写必要的代码来做我想做的事,但我认为通用视图会处理基础知识。
  • 是的,objects.all() 将适用于您的查询集。当然,您不需要为每个对象编写相同的视图,但为单独的模型编写单独的视图可能是明智的(或在适当的情况下为每个模型使用通用视图)。换句话说,在 url 中捕获模型名称以跨模型使用相同的视图可能不是一个好主意,并且无论如何使用 object_list 和 object_detail 都无法实现。
  • 你能说一下为什么你认为拥有一个包含模型名称的通用 URL “可能不是一个好主意”吗?它在几个项目中对我来说效果很好。
  • 我同意 ozan 的观点,即在 urls.py 文件中使用通用视图是行不通的。下面的答案建议使用 views.py 并创建执行模型查找的视图,看起来它会起作用。但为什么这是一个坏主意。为什么要在视图中为模型中的每个对象剪切和粘贴 CRUD 函数?
猜你喜欢
  • 2017-04-26
  • 2016-09-28
  • 2016-08-08
  • 2012-07-22
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多