Шаблон CRUD для urls.py, передавая объект из URI для просмотра - PullRequest
3 голосов
/ 31 августа 2009

Может ли значение объекта быть найдено и передано в общий вид? Должны ли общие представления быть перемещены в 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'),'
)

Примеры URL:

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

Я бы хотел использовать (? P \ w +), чтобы найти соответствующую модель, 'Thing', но когда этот код выполняется, возникает следующая ошибка: object_list () получил неожиданный аргумент ключевого слова 'model'

Ответы [ 2 ]

4 голосов
/ 01 сентября 2009

Да, вы можете сделать это, и я сделал это. Общие представления 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)

Если вы сообразительны и хотите сохранить все как можно более СУХИМ, вы можете создать одну оболочку, которая принимает функцию общего вида для вызова в качестве одного из аргументов, вместо того, чтобы иметь оболочку для создания, оболочку для обновления и т. д.

1 голос
/ 31 августа 2009

Я думаю, вы можете быть немного озадачены тем, для чего предназначены общие представления. Например, если вы прочитаете django.views.generic.list_detail , вы увидите, что ни object_list, ни object_detail не принимают аргумент "object", но оба требуют аргумент "queryset". Вам не нужно «находить соответствующую модель» - оба общих представления являются просто распространенными способами визуализации предоставленного набора запросов (в случае object_detail, после фильтрации по object_id или slug и slug_field). Я не полностью уверен, что вы пытаетесь сделать, но я не думаю, что эти общие взгляды - это то, что вы ищете.

...