Django - Vue - 如何为标签生成视图,或者?
Django - Vue - how to generate view for tag, or?
我将 vue 和 django 与 rest 框架一起使用。在 Django models.py 中,我有模型字段“tahs”,这是带有用逗号分隔的标签的 charfield。
例如 : django,forest,native
我想为每个标签示例“django”生成视图。
要么
尝试在已归档的标签中搜索,并且 return 对象包含此标签[ex.django]
这是我的views.py
class TagsResultsViewSet(viewsets.ModelViewSet):
serializer_class = TagResultsViewSetSerializer
queryset = CustomUserPass.objects.all()
lookup_field = 'tahs'
def get_queryset(self, *args, **kwargs):
context = super().get_queryset(*args, **kwargs)
tag = self.kwargs['tahs']
print('this is tags:', tag)
context = self.queryset.filter(tahs__icontains=tag)
print(context)
return context
serializer.py
class TagResultsViewSetSerializer(serializers.ModelSerializer):
tahs = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = CustomUserPass
fields = '__all__'
urls.py
router = DefaultRouter()
...
router.register('tags', TagsPassViewSet, basename='tags')
router.register('tag', TagsResultsViewSet, basename='tag')
urlpatterns = [
path('', include(router.urls)),
]
vue 文件:TagView.vue
<template>
<div class="about">
<h1>You looking: {{tag}}</h1>
<div v-for="result in results" :key="result.id">
<div>{{result.username}}</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'TagView',
data() {
return {
results: [],
errors: [],
}
},
props: {
tag: {
type: String,
required: true,
},
},
mounted() {
this.getTagsResults()
},
methods: {
async getTagsResults() {
this.$store.commit('setIsLoading', true)
axios
.get(`/api/v1/tag/${this.tag}`)
.then(response => {
this.results = response.data
console.log(this.results)
})
.catch(error => {
console.log(error)
})
this.$store.commit('setIsLoading', false)
},
}
}
</script>
实际上当我访问 http://localhost:8080/tags/linux
我在控制台中有输出:
this is tags: linux
<QuerySet [<CustomUserPass: drw>, <CustomUserPass: user1>]>
Not Found: /api/v1/tag/linux/
[11/Apr/2022 11:26:44] "GET /api/v1/tag/linux/ HTTP/1.1" 404 23
编辑
当我在 vue 中更改时
.get(`/api/v1/tag/${this.tag}`)
至
.get('/api/v1/tag/')
和
观看次数
class TagsResultsViewSet(viewsets.ModelViewSet):
serializer_class = TagResultsViewSetSerializer
queryset = CustomUserPass.objects.all()
lookup_field = 'tahs'
def get_queryset(self, *args, **kwargs):
context = super().get_queryset(*args, **kwargs)
tag = 'django'
print('this is tags:', tag)
context = self.queryset.filter(tahs__icontains=tag)
print(context)
return context
它是渲染的,但 tag = 'django'
是硬编码的 - 例如。
当我从 vue 中删除 ${this.tag}
时,我的 kwargs 是空的。
我做不到 tag = self.kwargs['tahs']
urls.py(应用程序)
router = DefaultRouter()
router.register('navbar', NavbarPassViewSet, basename='navbar')
router.register('profile', ProfilePassViewSet, basename='profile')
router.register('profiles', ProfilesPassViewSet, basename='profiles')
router.register('online', ProfilesOnlineChecker, basename='online')
router.register('projects', PassProjectAll, basename='projects')
router.register('myproject', MyProjects, basename='myproject')
router.register('project', ProjectDetail, basename='project')
router.register('tags', TagsPassViewSet, basename='tags')
router.register('tag', TagsResultsViewSet, basename='tag')
urlpatterns = [
path('', include(router.urls)),
]
当你去 api/v1/tags/linux/
DRF 做 queryset.get(tahs="linux")
.
这不适用于您的数据,因为您的 tahs
字段可能包含其他词。所以你得到一个 404 错误。您几乎可以通过将视图集 lookup_field
属性设置为 tahs__icontains
来解决此问题,但是 DRF 预计它只会得到一个结果,因为您可能有多个包含 [=16] 的 CustomUserPass
实例=].这是因为 api/v1/tags/linux
被视图集视为单个实例的详细端点(单个实例的 returns 数据),而不是列表端点(将 return 数据的实例列表)。
你真正想要做的是使用 django-filters
包(它也与 DRF 集成得很好)添加一个过滤器,然后在列表端点上执行你的 API 查询,如下所示:api/v1/tags/?tahs=linux
(或类似的)。
我将 vue 和 django 与 rest 框架一起使用。在 Django models.py 中,我有模型字段“tahs”,这是带有用逗号分隔的标签的 charfield。 例如 : django,forest,native
我想为每个标签示例“django”生成视图。 要么 尝试在已归档的标签中搜索,并且 return 对象包含此标签[ex.django]
这是我的views.py
class TagsResultsViewSet(viewsets.ModelViewSet):
serializer_class = TagResultsViewSetSerializer
queryset = CustomUserPass.objects.all()
lookup_field = 'tahs'
def get_queryset(self, *args, **kwargs):
context = super().get_queryset(*args, **kwargs)
tag = self.kwargs['tahs']
print('this is tags:', tag)
context = self.queryset.filter(tahs__icontains=tag)
print(context)
return context
serializer.py
class TagResultsViewSetSerializer(serializers.ModelSerializer):
tahs = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = CustomUserPass
fields = '__all__'
urls.py
router = DefaultRouter()
...
router.register('tags', TagsPassViewSet, basename='tags')
router.register('tag', TagsResultsViewSet, basename='tag')
urlpatterns = [
path('', include(router.urls)),
]
vue 文件:TagView.vue
<template>
<div class="about">
<h1>You looking: {{tag}}</h1>
<div v-for="result in results" :key="result.id">
<div>{{result.username}}</div>
</div>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'TagView',
data() {
return {
results: [],
errors: [],
}
},
props: {
tag: {
type: String,
required: true,
},
},
mounted() {
this.getTagsResults()
},
methods: {
async getTagsResults() {
this.$store.commit('setIsLoading', true)
axios
.get(`/api/v1/tag/${this.tag}`)
.then(response => {
this.results = response.data
console.log(this.results)
})
.catch(error => {
console.log(error)
})
this.$store.commit('setIsLoading', false)
},
}
}
</script>
实际上当我访问 http://localhost:8080/tags/linux 我在控制台中有输出:
this is tags: linux
<QuerySet [<CustomUserPass: drw>, <CustomUserPass: user1>]>
Not Found: /api/v1/tag/linux/
[11/Apr/2022 11:26:44] "GET /api/v1/tag/linux/ HTTP/1.1" 404 23
编辑
当我在 vue 中更改时
.get(`/api/v1/tag/${this.tag}`)
至
.get('/api/v1/tag/')
和
观看次数
class TagsResultsViewSet(viewsets.ModelViewSet):
serializer_class = TagResultsViewSetSerializer
queryset = CustomUserPass.objects.all()
lookup_field = 'tahs'
def get_queryset(self, *args, **kwargs):
context = super().get_queryset(*args, **kwargs)
tag = 'django'
print('this is tags:', tag)
context = self.queryset.filter(tahs__icontains=tag)
print(context)
return context
它是渲染的,但 tag = 'django'
是硬编码的 - 例如。
当我从 vue 中删除 ${this.tag}
时,我的 kwargs 是空的。
我做不到 tag = self.kwargs['tahs']
urls.py(应用程序)
router = DefaultRouter()
router.register('navbar', NavbarPassViewSet, basename='navbar')
router.register('profile', ProfilePassViewSet, basename='profile')
router.register('profiles', ProfilesPassViewSet, basename='profiles')
router.register('online', ProfilesOnlineChecker, basename='online')
router.register('projects', PassProjectAll, basename='projects')
router.register('myproject', MyProjects, basename='myproject')
router.register('project', ProjectDetail, basename='project')
router.register('tags', TagsPassViewSet, basename='tags')
router.register('tag', TagsResultsViewSet, basename='tag')
urlpatterns = [
path('', include(router.urls)),
]
当你去 api/v1/tags/linux/
DRF 做 queryset.get(tahs="linux")
.
这不适用于您的数据,因为您的 tahs
字段可能包含其他词。所以你得到一个 404 错误。您几乎可以通过将视图集 lookup_field
属性设置为 tahs__icontains
来解决此问题,但是 DRF 预计它只会得到一个结果,因为您可能有多个包含 [=16] 的 CustomUserPass
实例=].这是因为 api/v1/tags/linux
被视图集视为单个实例的详细端点(单个实例的 returns 数据),而不是列表端点(将 return 数据的实例列表)。
你真正想要做的是使用 django-filters
包(它也与 DRF 集成得很好)添加一个过滤器,然后在列表端点上执行你的 API 查询,如下所示:api/v1/tags/?tahs=linux
(或类似的)。