Как администратор Django разрешает модели из URL? - PullRequest
1 голос
/ 21 января 2012

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

Я получаю URL, как это "/ admin / video / item /"

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

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

Обновление:

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

Документация гласит:

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

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

Ответы [ 3 ]

3 голосов
/ 21 января 2012

URL администратора состоят из метки приложения и названия модели.

Вы можете использовать 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 голосов
/ 27 декабря 2016

Опираясь на ответ Юджи, предполагая, что вы создаете его для пользователей, не являющихся сотрудниками, вот способ 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

Я разместил вопрос, подобный этому здесь: Динамически передать app_label и model_name в URL в Python Django

0 голосов
/ 21 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...