#django #django-models #django-rest-framework #django-forms #django-views
#django #django-модели #django-rest-framework #django-forms #django-просмотры
Вопрос:
Мой основной urls.py находится здесь ahlami -> ахлами -> urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('api/accounts/', include('accounts.api.urls')),
]
Приложение «Мои учетные записи» urls.py находится здесь ahlami -> учетные записи -> api -> urls.py
urlpatterns = [
path('users/<int:pk>/', views.UserView.as_view(), name='user-detail')
]
Одна из моих учетных записей views.py возвращает
token = Token.objects.create(......)
return Response(data=AnonymousUserTokenResponseSerializer(instance=token).data)
Моя модель токена содержит только три поля. Для простоты я перечислил одно поле ниже
class Token(rest_framework.authtoken.models.Token):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE
AnonymousUserTokenResponseSerializer связан с моделью токена и возвращает три атрибута json
class AnonymousUserTokenResponseSerializer(serializers.ModelSerializer):
user_id = serializers.ReadOnlyField(source='user.id')
user_url = reverse(viewname='user-detail')
class Meta:
model = Token
fields = ('key',
'user_id',
'user_url')
Сбой AnonymousUserTokenResponseSerializer, поскольку он не может идентифицировать reverse()
user_url = reverse(viewname='user-detail')
python manage.py runserver выдает ошибку ниже из-за строки выше
django.core.exceptions.Неправильно сконфигурировано: в включенном URLconf ‘ahlami.urls’, похоже, нет никаких шаблонов. Если вы видите допустимые шаблоны в файле, то проблема, вероятно, вызвана циклическим импортом.
Мои настройки находятся здесь ahlami -> ahlami -> настройки -> base.py и base.py имеет ли это
ROOT_URLCONF = 'ahlami.urls'
Я ожидаю получить вывод, который выглядит как, но не смог из-за ошибки выше.
{
"key": "891e388399f2fcae016fe6887107034239041478",
"user_id": 29,
"user_url": http://localhost/api/accounts/users/29
}
Как я могу устранить эту ошибку и заставить reverse () работать?
django.core.exceptions.Неправильно сконфигурировано: в включенном URLconf ‘ahlami.urls’, похоже, нет никаких шаблонов. Если вы видите допустимые шаблоны в файле, то проблема, вероятно, вызвана циклическим импортом.
Комментарии:
1. То, что вы поместили
user_url
в сериализатор, не имеет никакого смысла, поскольку это не поле сериализатора2. Что вы имеете в виду? Вы имеете в виду, что user_url не является токеном части? идентификатор пользователя также не является частью сериализатора. Я объявил user_id, и это сработало.
3.
user_id
является полем сериализатора DRF , ноuser_url
не является
Ответ №1:
Использование serializers.HyperlinkedIdentityField
class AnonymousUserTokenResponseSerializer(serializers.ModelSerializer):
user_id = serializers.ReadOnlyField(source='user.id')
user_url = serializers.HyperlinkedIdentityField(
view_name='user-detail',
source='user.id',
lookup_field='pk'
)
class Meta:
model = Token
fields = ('key', 'user_id', 'user_url')
Комментарии:
1. Идеально! Это сработало. Спасибо Араккалу… Мне пришлось внести несколько изменений. Мне пришлось передать контекст в метод моего сериализатора
return Response(data=AnonymousUserTokenResponseSerializer(instance=token, context={'request': request}).data)
, и мне пришлось перейти на сериализаторы. Гиперссылка identityfield на сериализаторы. Hyperlink RelatedFielduser_url = serializers.HyperlinkedRelatedField( view_name='user-detail', source='user.id', lookup_field='pk', read_only='True' )
2. Просто пытаюсь понять, почему я должен был передать return context={‘request’: запрос}. Если у вас есть какие-либо мысли, не стесняйтесь поделиться ими здесь. В любом случае, я погуглю это.
3. потому что DRF использует объект запроса внутри для создания URL-адреса