2012-01-21 4 views
1

Как django-admin разрешает модель из URL-адреса?Как администратор django разрешает модели с URL?

Я принимает URL, как это "/ администратор/видео/п /"

Как я могу сделать то же самое? Получить модель из этого url ...

Мне нужно реализовать функцию, которая получает '/ admin/vide/item' и возвращает объект Item в видео приложении.

Update:

Я могу легко превратить «Администратор/видео/пункты» в video.models.Item, но им не уверен, что если первая позже в названии модели в верхнем регистре, или может быть больше верхнего регистра laters.

Документация говорит:

view, args, kwargs = urlresolvers.resolve('/admin/video/item/') 
enter code hereview(*args,**kwargs) 

так что я вид права? Следующий вопрос: как мне получить модель из этой точки зрения?

ответ

3

Адреса электронной почты содержат метку приложения и название модели.

Вы можете использовать django.db.models.get_model, чтобы получить класс модели из этих двух строк.

# urls 
(r'^admin/(?P<app_label>\w+)/(?P<model_name>\w+)/$', my_view), 

# view 
from django.db.models import get_model 

def my_view(request, app_label, model_name): 
    model_class = get_model(app_label, model_name) 
    return http.HttpResponse(model_class.objects.all()) 
0

Является ли структура файлов приложений зарегистрированной в админке. Я имею в виду, если вы зарегистрируете модель, первым элементом для индексирования будет имя приложения, а второе - имя модели, определенное в файле models.py. поэтому это означает, что он будет искать класс элемента, определенный в video/models.py.

В файле настроек вы можете импортировать в свое представление абсолютный путь вашего проекта, а затем динамически импортировать требуемую модель, используя split по запросу. Path и ... в конце получите элемент с идентификатором, который является последний элемент в вашей разбитой строке.

+0

его грязный. и не помогает мне, если имя модели имеет более одного заглавного письма. – Pol

+0

Вы совершенно правы – Davsket

0

Опираясь на ответ Юдзи, в предположении, вы строите это для «некадровых» пользователей, вот GCBV способ сделать то же самое:

# urls.py 
url(r'^(?P<app_label>[\w\-]+)/(?P<model_name>[\w\-]+)/$', DynamicListView.as_view(), name='list'), 


# views.py  
class DynamicListView(LoginRequiredMixin, ListView): 
     template_name = 'dynamic_list.html' 

     @property 
     def model(self): 
     return apps.get_model(app_label=str(self.kwargs['app_label']), model_name=str(self.kwargs['model_name'])) 

     @property 
     def app_label(self): 
     return str(self.kwargs['app_label']) 

     def get_queryset(self): 
     queryset = super(DynamicListView, self).get_queryset() 
     return queryset.filter(**self.request.GET.dict()) 

     def dispatch(self, request, *args, **kwargs): 
     if request.user.is_superuser: 
      return super(DynamicListView, self).dispatch(request, *args, **kwargs) 

     else: 
      # Set permissions here for non-staff users 

я разместил вопрос, похожий на этот здесь: Dynamically pass app_label and model_name to the url in Python Django

Смежные вопросы