Неправильные перенаправления при использовании defaultRouter () для ModelViewSet в Django-REST-framework - PullRequest
3 голосов
/ 10 мая 2019

У меня есть проект Django, в котором я сделал 3 разных приложения: «блог», «пользователи», «api». Это веб-сайт, на котором можно публиковать сообщения с помощью модельного сообщения. Я хочу использовать Django Rest API для доступа к модели. Это работает, но это портит некоторые перенаправления UpdateView и DeleteView «блога». Я думаю, что это может быть проблема с использованием DefaultRouter ()?

Когда я пытаюсь использовать представления блога / блога PostupdateView / PostDeleteView (унаследованные от UpdateView и DeleteView), я продолжаю перенаправляться на / api / blog / postid / вместо того, чтобы просто получить доступ к своему detailView, где путь должен быть просто / blog / postid / и я не могу понять, почему.

Мой пост Модель:

class Post(models.Model):
    ...
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

мой сериализатор:

class PostSerializer(serializers.ModelSerializer):
   class Meta:
        model = Post
        fields = ('id', 'title', 'content', 'date_posted', 'author', 'rooms')

мой API-интерфейс для сообщения:

  class PostView(viewsets.ModelViewSet):
        queryset = Post.objects.all()
        serializer_class = PostSerializer

Мои файлы URL:

main urls.py:

urlpatterns = [
    ...
    path('', include('blog.urls')),
    path('api/',include('api.urls')),
]

blog / urls.py:

urlpatterns = [
   ...
    path('post/<int:pk>/', PostDetailView.as_view(),name='post-detail'),
    path('post/new/', PostCreateView.as_view(),name='post-create'),
   ...
]

api / urls.py:

router = routers.DefaultRouter()
router.register('post', views.PostView)

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

мой PostCreateView в блоге / views.py

class PostCreateView( LoginRequiredMixin, UserPassesTestMixin, CreateView):
    model = Post
    fields = ['title', 'content', 'rooms']

    def test_func(self):
        ...

    def get_form(self, form_class=None):
        ...

    def form_valid(self, form):
        ...

При использовании PostCreateView меня следует перенаправить на подробный вид созданной публикации, как это определено в модели Post. Вместо этого меня перенаправляют на URL-адрес API, который генерируется маршрутизатором в файле api / urls.py

.

1 Ответ

2 голосов
/ 10 мая 2019

Один из простых способов решения проблемы - изменить метод get_absolute_url() на

class Post(models.Model):
    ...

    def __str__(self):
        return self.title

    <b>def get_absolute_url(self):
        return "/blog/{}/".format(self.pk)</b>

UPDATE

В чем была проблема?

Вы определили URL с тем же именем, post-detail, для API и обычного просмотра. Вы должны назвать URL-адреса уникальными именами.

# blog/urls.py
urlpatterns = [
    ...
    path('post/<int:pk>/', PostDetailView.as_view(), <b>name='blog-post-detail'</b>),
    path('post/new/', PostCreateView.as_view(), <b>name='blog-post-create'</b>),
    ...
]
#models.py
class Post(models.Model):
    ...

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        <b>return reverse('blog-post-detail', kwargs={'pk': self.pk})</b>
...