Nuxt&Django REST Framework에서 CRUD GET편②
개요
앞:Nuxt
백엔드: Django REST Framework(이하 DRF)
에서 새로운 프로젝트 등을 시작했을 때 설정 등을 일일이 조사하는 것이 귀찮게 되었기 때문에, 정리해 둡니다.
다만, 설정 파일만을 쓰는 것은 개인적으로 기사로서 부족하다.
그래서 김에 기본적인 조작인 API를 두드려 CRUD를 실시해, 회원등록을 구현하는 곳까지 쓸 예정입니다.
덧붙여 이번은 DB는 SQLite를 사용합니다. PostgreSQL이나 MySQL등 다른 RDB가 사용하고 싶은 경우는 DRF측의 DB의 설정을 바꿔 쓸 뿐이므로, 그쪽의 설정은 각자 잘 부탁드리겠습니다.
이 기사에서는 Nuxt에서 DRF로 만든 API를 두드려 데이터베이스에서 정보를 얻고 상세한 정보를 클라이언트 측에서 표시시키는 곳까지입니다.
소스 코드는 여기 에 있으므로 모르는 곳은 적절히 봐 주세요.
또, 트위터 인가 이 기사의 코멘트란에서 모르는 곳을 (들)물어 주실 수 있다고 대답할 수 있습니다.
지난번
Nuxt&Django REST Framework에서 CRUD GET편①
프로젝트 구성
전회는 inspire.vue
에 직접 코드를 추가해 상품란도 일람을 추가했습니다.
그러나 이것으로는 조금 본 목적에 좋지 않기 때문에 세세한 변경을 더해 갑니다.
Nuxt에서 페이지의 vue 파일의 트리 구조는 vue-router를 따라 설정을 자동으로 생성합니다.
Nuxt 문서 의 예에도 있듯이, 디렉토리 구조가 이하의 경우에는,
pages/
--|_slug/
-----|comments.vue
-----|index.vue
--| users/
-----|_id.vue
--|index.vue
자동으로 다음이 생성됩니다.
router: {
routes: [
{
name: 'index',
path: '/',
component: 'pages/index.vue'
},
{
name: 'users-id',
path: '/users/:id?',
component: 'pages/users/_id.vue'
},
{
name: 'slug',
path: '/:slug',
component: 'pages/_slug/index.vue'
},
{
name: 'slug-comments',
path: '/:slug/comments',
component: 'pages/_slug/comments.vue'
}
]
}
이러한 사양 때문에 라우팅에 관한 수고를 줄일 수 있다는 이점이 있습니다.
따라서 먼저 새 pages
안에 items
폴더를 새로 만들고 그 안에 item의 id에 따라 상세 페이지를 만들 수 있도록 _id
폴더를 만듭니다. 이렇게 폴더 안에 _id
폴더를 만드는 것으로 취득한 id에 따른 정보를 자동으로 페이지를 정제해 줍니다.
Github을 보면서이 근처를 진행하면 알기 쉬울까 생각합니다.
그리고 items
폴더에 index.vue
를 만들고 다음과 같이 이전에 쓴 코드를 로고 빼고 이식하고
마지막까지
하지만 이번에는
방문해 봅시다.
items/index.vue<template>
<main class="container mt-5">
<div class="row">
<div class="col-12 text-right mb-4">
<div class="d-flex justify-content-between">
<h3>商品一覧</h3>
<!-- <nuxt-link to="/items/add" class="btn btn-info">
商品を追加する
</nuxt-link> -->
</div>
</div>
<template v-for="item in items">
<div :key="item.id" class="col-lg-3 col-md-4 col-sm-6 mb-4">
<!--<item-card :on-delete="deleteitem" :item="item" />-->
</div>
</template>
</div>
</main>
</template>
<script>
import ItemCard from '~/components/ItemCard.vue'
export default {
components: {
ItemCard
},
async asyncData ({ $axios, params }) {
try {
const items = await $axios.$get('items/')
return { items }
} catch (e) {
return { items: [] }
}
},
data () {
return {
items: []
}
},
head () {
return {
title: '商品一覧'
}
}
}
</script>
그러면 이런 느낌입니다. Vuetify 로고가 들어갈 때보다 그렇게되었습니다.
계속해서 상세를 클릭했을 때 제대로 그 페이지의 설명문 등 상세한 설명이 나오도록 합시다.
다음과 같이 써 보겠습니다.
items/_id/index.vue<template>
<main class="container my-5">
<div class="row">
<div class="col-12 text-center my-3">
<h2 class="mb-3 display-4 text-uppercase">
{{ item.name }}
</h2>
</div>
<div class="col-md-6 mb-4">
<img
class="img-fluid"
style="width: 400px; border-radius: 10px; box-shadow: 0 1rem 1rem rgba(0,0,0,.7);"
:src="item.image"
alt
>
</div>
<div class="col-md-6">
<div class="item-details">
<h4>カテゴリー</h4>
<p>{{ item.category }}</p>
<h4>値段</h4>
<p>{{ item.price }}</p>
<h4>説明</h4>
<p>{{ item.description }}</p>
</div>
</div>
</div>
</main>
</template>
<script>
export default {
async asyncData ({ $axios, params }) {
try {
const item = await $axios.$get(`/items/${params.id}`)
return { item }
} catch (e) {
return { item: [] }
}
},
data () {
return {
item: {
id:'',
name:'',
image:'',
price:'',
description:'',
}
}
},
head () {
return {
title: '商品詳細'
}
}
}
</script>
<style scoped>
</style>
그리고 상세를 클릭하면 이런 느낌입니다.
목록 페이지에서 읽을 수 없었던 설명을 읽을 수 있습니다.
이러한 느낌에 상품 일람의 페이지에서는 필요 최저한의 정보를 취득해, 각 id마다의 페이지에서는 보다 상세한 정보를 취득해, 표시하는, 같은 사용 구분을 합니다.
상세 페이지를 만드는 방법에 대해서는 이것 정도로 끝입니다.
다음 번은 POST편입니다.
※추기
썼습니다!
Nuxt&Django REST Framework에서 CRUD POST편
Reference
이 문제에 관하여(Nuxt&Django REST Framework에서 CRUD GET편②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/KueharX/items/48d44db339e4a2fbaa71
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
전회는
inspire.vue
에 직접 코드를 추가해 상품란도 일람을 추가했습니다.그러나 이것으로는 조금 본 목적에 좋지 않기 때문에 세세한 변경을 더해 갑니다.
Nuxt에서 페이지의 vue 파일의 트리 구조는 vue-router를 따라 설정을 자동으로 생성합니다.
Nuxt 문서 의 예에도 있듯이, 디렉토리 구조가 이하의 경우에는,
pages/
--|_slug/
-----|comments.vue
-----|index.vue
--| users/
-----|_id.vue
--|index.vue
자동으로 다음이 생성됩니다.
router: {
routes: [
{
name: 'index',
path: '/',
component: 'pages/index.vue'
},
{
name: 'users-id',
path: '/users/:id?',
component: 'pages/users/_id.vue'
},
{
name: 'slug',
path: '/:slug',
component: 'pages/_slug/index.vue'
},
{
name: 'slug-comments',
path: '/:slug/comments',
component: 'pages/_slug/comments.vue'
}
]
}
이러한 사양 때문에 라우팅에 관한 수고를 줄일 수 있다는 이점이 있습니다.
따라서 먼저 새
pages
안에 items
폴더를 새로 만들고 그 안에 item의 id에 따라 상세 페이지를 만들 수 있도록 _id
폴더를 만듭니다. 이렇게 폴더 안에 _id
폴더를 만드는 것으로 취득한 id에 따른 정보를 자동으로 페이지를 정제해 줍니다.Github을 보면서이 근처를 진행하면 알기 쉬울까 생각합니다.
그리고
items
폴더에 index.vue
를 만들고 다음과 같이 이전에 쓴 코드를 로고 빼고 이식하고마지막까지
하지만 이번에는
방문해 봅시다.
items/index.vue
<template>
<main class="container mt-5">
<div class="row">
<div class="col-12 text-right mb-4">
<div class="d-flex justify-content-between">
<h3>商品一覧</h3>
<!-- <nuxt-link to="/items/add" class="btn btn-info">
商品を追加する
</nuxt-link> -->
</div>
</div>
<template v-for="item in items">
<div :key="item.id" class="col-lg-3 col-md-4 col-sm-6 mb-4">
<!--<item-card :on-delete="deleteitem" :item="item" />-->
</div>
</template>
</div>
</main>
</template>
<script>
import ItemCard from '~/components/ItemCard.vue'
export default {
components: {
ItemCard
},
async asyncData ({ $axios, params }) {
try {
const items = await $axios.$get('items/')
return { items }
} catch (e) {
return { items: [] }
}
},
data () {
return {
items: []
}
},
head () {
return {
title: '商品一覧'
}
}
}
</script>
그러면 이런 느낌입니다. Vuetify 로고가 들어갈 때보다 그렇게되었습니다.
계속해서 상세를 클릭했을 때 제대로 그 페이지의 설명문 등 상세한 설명이 나오도록 합시다.
다음과 같이 써 보겠습니다.
items/_id/index.vue
<template>
<main class="container my-5">
<div class="row">
<div class="col-12 text-center my-3">
<h2 class="mb-3 display-4 text-uppercase">
{{ item.name }}
</h2>
</div>
<div class="col-md-6 mb-4">
<img
class="img-fluid"
style="width: 400px; border-radius: 10px; box-shadow: 0 1rem 1rem rgba(0,0,0,.7);"
:src="item.image"
alt
>
</div>
<div class="col-md-6">
<div class="item-details">
<h4>カテゴリー</h4>
<p>{{ item.category }}</p>
<h4>値段</h4>
<p>{{ item.price }}</p>
<h4>説明</h4>
<p>{{ item.description }}</p>
</div>
</div>
</div>
</main>
</template>
<script>
export default {
async asyncData ({ $axios, params }) {
try {
const item = await $axios.$get(`/items/${params.id}`)
return { item }
} catch (e) {
return { item: [] }
}
},
data () {
return {
item: {
id:'',
name:'',
image:'',
price:'',
description:'',
}
}
},
head () {
return {
title: '商品詳細'
}
}
}
</script>
<style scoped>
</style>
그리고 상세를 클릭하면 이런 느낌입니다.
목록 페이지에서 읽을 수 없었던 설명을 읽을 수 있습니다.
이러한 느낌에 상품 일람의 페이지에서는 필요 최저한의 정보를 취득해, 각 id마다의 페이지에서는 보다 상세한 정보를 취득해, 표시하는, 같은 사용 구분을 합니다.
상세 페이지를 만드는 방법에 대해서는 이것 정도로 끝입니다.
다음 번은 POST편입니다.
※추기
썼습니다!
Nuxt&Django REST Framework에서 CRUD POST편
Reference
이 문제에 관하여(Nuxt&Django REST Framework에서 CRUD GET편②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/KueharX/items/48d44db339e4a2fbaa71텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)