[PYTHON] CRUD GET mit Nuxt & Django REST Framework ①

Überblick

Vorderseite: Nuxt Backend: Django REST Framework (DRF) Als ich ein neues Projekt usw. in startete, wurde es schwierig, die Einstellungen usw. einzeln zu überprüfen, sodass ich es zusammenfassen werde.

Es reicht jedoch nicht aus, nur die Einstellungsdatei als Artikel persönlich zu schreiben.

Daher plane ich, bis zur Implementierung der Mitgliederregistrierung zu schreiben, indem ich auf die API drücke, die die Grundoperation ist, um CRUD durchzuführen. Dieses Mal verwendet DB SQLite. Wenn Sie eine andere RDB wie PostgreSQL oder MySQL verwenden möchten, schreiben Sie einfach die DB-Einstellungen auf der DRF-Seite neu. Nehmen Sie diese Einstellungen daher selbst vor.

In diesem Artikel erhalten Sie detaillierte Produktinformationen, indem Sie auf die von DRF aus Nuxt erstellte API klicken.

Den Quellcode finden Sie unter hier. Wenn Sie also Fragen haben, schauen Sie bitte.

Sie können auch antworten, indem Sie Twitter oder im Kommentarbereich dieses Artikels fragen, wenn Sie Fragen haben.

Backend

Erstellen Sie zunächst ein vertrautes Projekt. Lassen Sie uns von der Einstellung von der DRF-Seite aus arrangieren.

$  mkdir nuxt-django
$ cd nuxt-django
$ django-admin startproject server
$ cd server
$ django-admin startapp practice

Lassen Sie uns zunächst die Einstellungsdatei ändern.

settings.py


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'practice', #hinzufügen
    'rest_framework', #hinzufügen
    'corsheaders', #hinzufügen
]

......


#hinzufügen
#Herkunft zu erlauben
CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',
    'http://127.0.0.1:3000',
    )
CORS_ORIGIN_ALLOW_ALL = True

......

#Die folgenden Änderungen und Ergänzungen

# Internationalization
# https://docs.djangoproject.com/en/2.2/topics/i18n/

LANGUAGE_CODE = 'ja-JP'
TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

Was ich zu "INSTALLED_APPS" hinzugefügt habe, ist das "rest_framework", das für die Verwendung der in "startapp" hinzugefügten App und DRF unverzichtbar ist, und die "Corsheaders", die für den Zugriff mit Axios erforderlich sind.

CORS_ORIGIN_WHITELIST muss geschrieben werden, um festzulegen, wo der Zugriff zugelassen werden soll.

Ändern Sie danach "LANGUAGE_CODE" und "TIME_ZONE", um Japanisch zu unterstützen.

Das letzte "MEDIA ..." wurde hinzugefügt, um das Bild danach zu verarbeiten. Es ist nicht erforderlich, wenn Sie die Bilddatei nicht verwenden. Es wird jedoch empfohlen, sie zu beschreiben, da sie in vielen Fällen verwendet wird.

urls.py


from django.contrib import admin
from django.urls import path,include #hinzufügen
from django.conf.urls.static import static #hinzufügen
from django.conf import settings #hinzufügen


urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/',include('practice.urls')),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

models.py


from django.db import models

# Create your models here.


CATEGORY = (
    (1, 'Getränk'),
    (2, 'Blumenarrangement'),
)

class Item(models.Model):
    name = models.CharField(verbose_name='Produktname',max_length=255,null=False)
    category = models.IntegerField(verbose_name='Kategorie',choices=CATEGORY)
    image = models.FileField(verbose_name='Bild')
    price = models.PositiveIntegerField(verbose_name='Bild',null=False)
    description = models.TextField(verbose_name='Einzelheiten',blank=True,null=True)

    def __str__(self):
        return self.name

Diesmal habe ich ein Modell eines gemeinsamen Produkts gemacht. Erstellen Sie dann einen Serializer, um dieses Element zu verarbeiten.

serializers.py


from rest_framework import serializers
from .models import Item

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'

Schreiben Sie dann views.py und urls.py, um dies weiterzuleiten.

views.py


from django.shortcuts import render

from rest_framework import viewsets,filters,permissions,generics
from .serializers import ItemSerializer
from .models import Item

# Create your views here.
class ItemListView(generics.ListAPIView):
    serializer_class = ItemSerializer
    queryset = Item.objects.all()

class ItemDetailView(generics.RetrieveAPIView):
    serializer_class = ItemSerializer
    queryset = Item.objects.all()

practice/urls.py


from django.urls import path

from .views import ItemListView,ItemDetailView

urlpatterns = [
    path('items/',ItemListView.as_view()),
    path('items/<int:pk>/',ItemDetailView.as_view()),
]

Fügen Sie abschließend Folgendes hinzu, damit der Administrator mit den Daten umgehen kann.

admin.py


from django.contrib import admin

from .models import Item

# Register your models here.
admin.site.register(Item)

In Bezug darauf, warum "ItemListView" und "ItemDetailView" getrennt werden, ist es einfacher zu verwenden, wenn sie bei der Implementierung von Berechtigungen getrennt werden, und sie müssen später getrennt werden.

Damit sind die grundlegenden Backend-Einstellungen abgeschlossen.

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py createsuperuser
Nutzername(leave blank to use 'kuehar'): kueharx
Mail Adresse: 
Password: 
Password (again): 
Superuser created successfully.
$ python manage.py runserver

Bei laufendem lokalen Server http://localhost:8000/admin Lassen Sie uns auf solche Daten zugreifen und sie hinzufügen.

スクリーンショット 2020-05-10 18.44.25.png

Nachdem http://localhost:8000/api/items Wenn Sie darauf zugreifen, sollte ein Bildschirm wie der folgende angezeigt werden.

スクリーンショット 2020-05-10 19.28.58.png

Zu diesem Zeitpunkt ist der Aufbau des Backends für GET vom Frontend aus abgeschlossen.

Fahren wir nun mit dem Aufbau des Frontends fort.

Vorderes Ende

Zuerst erstellen wir ein Projekt. Diesmal habe ich es mit den folgenden Einstellungen gemacht.

$ npx create-nuxt-app client

create-nuxt-app v2.15.0
✨  Generating Nuxt.js project in client
? Project name client
? Project description nuxt-django-auth sample app
? Author name kueharx
? Choose programming language JavaScript
? Choose the package manager Npm
? Choose UI framework Vuetify.js
? Choose custom server framework Express
? Choose Nuxt.js modules Axios
? Choose linting tools ESLint
? Choose test framework None
? Choose rendering mode Universal (SSR)
? Choose development tools (Press <space> to select, <a> to toggle all, <i> to invert selection)
$ cd client

Tu es

$ npm run dev

Dann

スクリーンショット 2020-05-10 20.35.59.png

Ich fühle mich so.

Ich werde Einstellungen hinzufügen. Zuerst,

$ npm install -s @nuxtjs/axios

Fügen Sie anschließend der Einstellungsdatei die folgende Beschreibung hinzu.

JavaScript:nuxt.config.js



....

modules: [
    '@nuxtjs/axios',
  ],

axios: {
    baseURL: 'http://localhost:8000/api/',
  },

Hinzufügen. Dies ist ein Element, das angibt, mit welchem lokalen Server bei Verwendung von Axios eine Verbindung hergestellt werden soll. Wenn Sie dies nicht hinzufügen, können Sie die zuvor erstellte API nicht aufrufen.

Nun, inspirieren sieht auf den ersten Blick so aus,

スクリーンショット 2020-05-10 20.36.55.png

Fügen wir etwas Code hinzu.

Dieses Mal werde ich eine Karte erstellen, auf der die Produktskizze und der Link angezeigt werden.

Lassen Sie uns zuerst diese Karte machen.

ItemCard.vue


<template>
  <div class="card item-card">
    <img :src="item.image" class="card-img-top">
    <div class="card-body">
      <h5 class="card-title">
        {{ item.name }}
      </h5>
      <p class="card-text">
        <strong>Kategorie</strong> {{ item.category }}
      </p>
      <p class="card-text">
        <strong>Preis:</strong> {{ item.price }}
      </p>
      <div class="action-buttons">
        <nuxt-link :to="`/items/${item.id}/`" class="btn btn-sm btn-primary">
Einzelheiten
        </nuxt-link>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  props: ['item', 'onDelete']
}
</script>
<style>
.item-card {
    box-shadow: 0 1rem 1.5rem rgba(0,0,0,.6);
}
img.card-img-top{
    height:200px;
}
.action-buttons {
  text-align: right;
}
</style>

Das Kartenlayout ist jetzt abgeschlossen.

Lassen Sie uns diese Karte mit Inspiration lesen.

inspire.vue


<template>
  <v-layout>
    <v-flex class="text-center">
      <img
        src="/v.png "
        alt="Vuetify.js"
        class="mb-5"
      >
      <blockquote class="blockquote">
        &#8220;First, solve the problem. Then, write the code.&#8221;
        <footer>
          <small>
            <em>&mdash;John Johnson</em>
          </small>
        <div class="row">
        <div class="col-12 text-right mb-4">
        <div class="d-flex justify-content-between">
          <h3>Produktliste</h3>
          <!-- <nuxt-link to="/items/add" class="btn btn-info">
Fügen Sie ein Produkt hinzu
          </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>
        </footer>
      </blockquote>
    </v-flex>
  </v-layout>
</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: []
    }
  },
  methods: {
    async deleteitem (item_id) { //eslint-disable-line
      try {
        await this.$axios.$delete(`/items/${item_id}/`) //eslint-disable-line
        const newitems = await this.$axios.$get('/items/')
        this.items = newitems
      } catch (e) {
        console.log(e)
      }
    }
  },
  head () {
    return {
      title: 'Produktliste'
    }
  }
}
</script>

Anwenden dieser ...

スクリーンショット 2020-05-10 21.53.22.png

Wie oben erwähnt, konnte ich die Liste richtig abrufen.

~~ Dieses Mal erstellen wir beim nächsten Mal eine Produktdetailseite. ~~

Ich habe geschrieben! CRUD GET mit Nuxt & Django REST Framework ②

Recommended Posts

CRUD GET mit Nuxt & Django REST Framework ②
CRUD GET mit Nuxt & Django REST Framework ①
Django REST Framework mit Vue.js
Melden Sie sich mit dem Django Rest Framework an
[Django] Verwenden Sie MessagePack mit dem Django REST-Framework
CRUD mit Django
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
Grundlagen des Django REST-Frameworks
Tipps zum Django Rest Framework
Implementierung der Authentifizierungsfunktion in Django REST Framework mit djoser
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Weitere neue Benutzerauthentifizierungsmethoden mit Django REST Framework
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Erstellen Sie eine API für die Benutzerauthentifizierung mit Django REST Framework
Fangen Sie mit Django an! ~ Tutorial ④ ~
Wenn Sie mit dem Django REST-Framework filtern möchten
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Django REST Framework Stolperstein
Implementieren Sie hierarchische URLs mit drf-verschachtelten Routern im Django REST-Framework
Wie fange ich mit Django an?
Erste Schritte mit dem Python-Framework Django unter Mac OS X.
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Schritt Notizen, um mit Django zu beginnen
Logisches Löschen in Django, DRF (Django REST Framework)
Verstehen Sie den Komfort des Django Rest Framework
Verschiedene Hinweise zum Django REST-Framework
Überlegungen zum Design von Django REST Framework + Clean Architecture
Wie man mit verstümmelten Charakteren in json von Django REST Framework umgeht
So können Sie die Funktionen des Django Rest Frameworks in einer Datei ausprobieren
Der einfachste Weg, um mit Django zu beginnen
Internationalisierung mit Django
So generieren Sie automatisch ein API-Dokument mit dem Django REST-Framework und POST vom Dokumentbildschirm
Django REST Framework Ein wenig nützlich zu wissen.
Implementieren Sie die JWT-Anmeldefunktion im Django REST-Framework
Manchmal möchten Sie mit DRF (Django REST Framework) auf View information from Serializer zugreifen.
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
Listenmethode für verschachtelte Ressourcen im Django REST-Framework
Implementieren Sie die API mit explosiver Geschwindigkeit mithilfe des Django REST Framework
[Django Rest Framework] Passen Sie die Filterfunktion mit Django-Filter an
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
Django 1.11 wurde mit Python3.6 gestartet
Entwicklungsverdauung mit Django
Django Python Web Framework
PDF mit Django ausgeben
Markdown-Ausgabe mit Django
Verwenden Sie Gentelella mit Django
Twitter OAuth mit Django
Erste Schritte mit Django 1
Mail mit Django senden
Datei-Upload mit Django
Beginnen Sie mit MicroPython
Holen Sie sich Tweets mit Tweepy
Verwenden Sie WENIGER mit Django
Holen Sie sich ein Date mit Python
Pooling mechanisieren mit Django
Beginnen Sie mit Mezzanine
Verwenden Sie MySQL mit Django