Django, DRF, получить имя просмотра другого приложения для реверса - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь создать ссылку на другое приложение в моем сериализаторе, используя решение, представленное здесь:

{ ссылка }

Я пытаюсь найти соответствие имя представления, но при каждом попытке я получаю эту ошибку:

Reverse for 'KnownLocationView' not found. 'KnownLocationView' is not a valid view function or pattern name.

сериализаторы:

class MissionSerializer(HyperlinkedModelSerializer):
    gdt = ChoiceField(choices=lazy(get_locations, tuple)())
    location = SerializerMethodField(label='Open Location')

    def get_location(self, obj):
        request = self.context.get('request')
        return request.build_absolute_uri(reverse('KnownLocationView', kwargs={'Name': obj.gdt}))

    class Meta:
        model = Mission
        fields = ('MissionName', 'UavLatitude', 'UavLongitude', 'UavElevation', 'Area',
                  'gdt', 'location')

KnownLoction / urls.py

from django.urls import path, include
from rest_framework.routers import DefaultRouter

from .views import KnownLocationView

app_name = 'KnownLocation'
router = DefaultRouter()
router.register(r'knownlocations', KnownLocationView)

urlpatterns = [
    path('', include(router.urls)),
]

Я попытался заменить view_name с одним из следующих:

'knownlocations'
'KnownLocation:knownlocations'
'KnownLocation:KnownLocationView'

Но получите ту же ошибку

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

api / urls.py:


urlpatterns = [
                  path('admin/', admin.site.urls),
                  path('accounts/', include('django.contrib.auth.urls')),
                  path('', include('landingpage.urls')),  # API Landing Page
                  path('', include('ThreeLocations.urls')),  # Triangulation between two Known GDTs and uav location.
                  path('', include('SecondGDT.urls')),  # Options For Second GDT Positioning.
                  path('', include('KnownLocation.urls', namespace='knownlocations')),
                  # Add Known Location To the map.
              ] + staticfiles_urlpatterns()

KnownLocation / views.py

from rest_framework.renderers import AdminRenderer
from rest_framework.viewsets import ModelViewSet

from .models import KnownLocation
from .serializers import KnownLocationSerializer


class KnownLocationView(ModelViewSet):
    """
    List of Known Locations In which we can place one of our ground positions.

    press create to add a new location.

    """
    serializer_class = KnownLocationSerializer
    queryset = KnownLocation.objects.all()

    def get_serializer_context(self):
        data = KnownLocationSerializer(self.queryset, many=True, context={'request': self.request})
        return data

    renderer_classes = [AdminRenderer]

1 Ответ

1 голос
/ 10 апреля 2020

Я думаю, вы должны попытаться изменить то, как вы называете обратное. Ссылка на него приведена ниже

Примечание: Если вы используете пространство имен с гиперссылочными сериализаторами, вам также необходимо убедиться, что любые параметры view_name в сериализаторах правильно отражают пространство имен. В приведенных выше примерах вам нужно будет включить параметр, такой как view_name = 'app_name: user-detail' для полей сериализатора, которые связаны с детальным представлением пользователя.

Автоматизация c view_name для генерации использует шаблон, подобный % (MODEL_NAME) -detail. Если имена ваших моделей на самом деле не соответствуют sh, возможно, вам лучше не использовать пространство имен для представлений Django REST Framework при использовании гиперссылочных сериализаторов.

Попробуйте использовать это

 reverse('KnownLocationView:mission-detail, kwargs={'Name': obj.gdt})

или

reverse('mission-detail, kwargs={'Name': obj.gdt})
...