シンプルなジャンゴCrudアプリ


こんにちは、あなたがちょうどJjangoを学び始めているならば、これは単純なCRUD(更新を検索して、削除する操作)の良い例です.
このチュートリアルでは、学生を作成、取得、更新、削除できるようにする単純なアプリケーションを作成します.

ステップ
1 .新規プロジェクトを作成する
モデルの作成
フォームを作成する
テンプレートフォルダの追加
5 .ビューを作成する

1 .新規プロジェクトを作成するdjango-admin startproject students-crudを使用して新しいDjangoプロジェクトを作成しますpython manage.py startapp studentsを使用してアプリケーションの学生を作成してください.
あなたの設定でアプリケーションを登録します.Pyファイル.

モデルの作成
我々は2モデル、ストリームモデルと学生モデルを持っている.
あなたの設定でアプリケーションを登録します.Pyファイル.
あなたの学生のアプリのモデルを開きます.Pyファイル.これは、以下のコードを使用してモデルを作成する場所です.
class Stream(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return f'{self.name}'

class Student(models.Model):
    name = models.CharField(max_length= 50)
    description = models.TextField()
    joindate = models.DateTimeField(auto_now_add = True)
    reg_no = models.CharField(max_length=100, unique=True)
    stream = models.ForeignKey(Stream, on_delete=models.CASCADE, 
             related_name="students")


    def __str__(self):
        return f'{self.name} reg {self.reg_no}' 

管理者に移動します.Pyと2つのモデルを次のように登録します.
from students.models import Student, Stream
# Register your models here.
admin.site.register(Student)
admin.site.register(Stream)

フォームを作成する
あなたのアプリケーションのフォルダで、新しいファイルを作成し、フォームの名前.Py
次のコードをファイルに追加します.
from django import forms
from .models import Student 


class CreateStudentForm(forms.ModelForm):

    class Meta:
        model = Student
        fields = "__all__"

テンプレートのフォルダを作成する
テンプレートを簡単にアクセスできるようにするには、すべてのテンプレートを含むテンプレートという名前のフォルダーを作成します.
あなたの設定に移動します.Pyは、テンプレート配列を見つけ、次のように置き換えます.
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
プロジェクトのルートフォルダに移動し、テンプレートという名前のフォルダを作成する

5 .ビューを作成する
あなたの意見に移動します.Pyファイルとコードの書き込みを開始します.
これには関数ベースのビューを使用します.
まず、学生インスタンスを作成するビューを作成します.
これは、我々の着陸ページのための眺めでもあります.
これを行うには、フォームで作成したフォームをインポートする必要があります.Py
このインポートをfrom .forms import CreateStudentForm次のビューに進みます.
def CreateStudent(request):
    if request.method == "POST":
        form = CreateStudentForm(request.POST)
        if form.is_valid():
            form.save()
            form = CreateStudentForm()
    else:
        form = CreateStudentForm()

    students = Student.objects.all().order_by("-id")
    context = {'form':form, 'students':students}
    return render(request, 'home.html', context)
私たちは最後の追加で始まる学生を表示したいと思いますstudents = Student.objects.all().order_by("-id")ファイルインデックスを作成します.HTMLの前の手順で作成したテンプレートです.
このテンプレートは、新しい学生を作成するためのフォームを示し、また、テーブル内の既存の学生を一覧表示されます.
各学生のインスタンスやレコードの場合は、表示または削除することができます.
私はそれがよく見えるようにブートストラップを追加しました.
あなたのインデックス.HTMLは次のようになります.
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
        integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"
        integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj"
        crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx"
        crossorigin="anonymous"></script>
    <title>Good Schools | Home</title>
</head>

<body>
  <div>
      <form method="post">
            {% csrf_token %} 
            {{form.as_p}}
            <button type="submit">Submit</button>
      </form>
  </div>
        <!-- list of students  -->
        <div>
            <h4 class="text-center mb-3 mt-3">Students List</h4>
            <div class="table-responsive-sm">
                <table class="table table-hover">
                    <thead class="thead-light">
                        <tr>
                            <th scope="col">Name</th>
                            <th scope="col">Reg No.</th>
                            <th scope="col">Stream</th>
                            <th scope="col">Description</th>
                            <th scope="col">Join Date</th>
                            <th scope="col">View</th>
                            <th scope="col">Delete</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for student in students %}
                        <tr>
                            <td class="text-capitalize">{{student.name}}</td>
                            <td>{{student.reg_no}}</td>
                            <td>{{student.stream}}</td>
                            <td class="text-capitalize">{{student.description}}</td>
                            <td>{{student.joindate}}</td>
                            <td>
                                <a role="button" class="btn btn-sm btn-outline-success"
                                    href="{% url 'std_detail' reg=student.reg_no %}">View</a>
                            </td>
                            <td>
                                <a role="button" class="btn btn-sm btn-outline-danger" href="{% url 'delete' id=student.id %}">Delete</a>
                                <!-- <button class="btn btn-sm btn-outline-danger">Delete</button></td> -->
                        </tr>
                        {% empty %}
                        <span class="text-center">No students to show</span>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
</body>
上記のように、私たちは特定の学生を見たいです.
これを達成するためには、別のビューを作成する必要があります.
私たちは学生モデルで使用されているRegencer Noを使用してデータベースから学生を取得するつもりです.
このビューは、学生インスタンスを更新するために使用されます.したがって、フォームの前に学生インスタンスを渡します.
def GetStudent(request, **kwargs):
    reg = kwargs.get('reg')
    student = get_object_or_404(Student, reg_no=reg)

    if request.method == "POST":
        form = CreateStudentForm(request.POST, instance=student)
        if form.is_valid():
            form.save()
    else:
        form = CreateStudentForm(instance=student)

    context = {'student':student, 'form': form}
    return render(request, 'std_detail.html', context )
我々のstdcho詳細.HTMLは次のようになります.
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-ho+j7jyWK8fNQe+A12Hb8AhRq26LrZ/JpcUGGOn+Y7RsweNrtN/tE3MoK7ZeZDyx" crossorigin="anonymous"></script>

    <title>Good Schools | Student Detail | {{student.reg_no}}</title>
  </head>
  <body>
    <div class="big-box container-fluid d-flex justify-content-center align-items-center">
        <div class="container mt-4 mb-5">
            <h4 class="text-center text-capitalize">{{student.name}}'s Profile</h4>
            <form class="mt-3" method="post">
                {% csrf_token %}
                  <div class="form-group">
                      <div class="row">
                          <div class="col">
                            <label>Name:</label>
                              {{form.name}}
                          </div>
                      </div>
                  </div>
                  <div class="form-group">
                      <div class="row">
                          <div class="col">
                            <label>Reg No.</label>
                              {{form.reg_no}}
                          </div>
                          <div class="col">
                            <label>Stream:</label>
                              {{form.stream}}
                          </div>
                      </div>
                  </div>
                  <div class="form-group">
                    <label>Description:</label>
                      {{form.description}}
                  </div>
                  <div class="form-group">
                      <div class="row">
                        <div class="col d-flex justify-content-center">
                          <button class="btn btn-warning btn-block text-white w-50">Update</button>
                        </div>
                        <div class="col d-flex justify-content-center">
                          <a href="{% url 'delete' id=student.id %}" role="button" class="btn btn-danger btn-block text-white w-50">Delete</a>
                        </div>
                      </div>
                  </div>
            </form>
        </div>
    </div>
    <div class="container d-flex justify-content-center">
      <a href="{% url 'create_student' %}" role="button" class="btn btn-outline-primary btn-block w-25">All Students</a>
    </div>
  </body>
</html>

学生を削除するには、我々はまた、それらを取得し、それらを削除するには、それらのRegencer noを使用します.
次のビューを示します.
def DeleteStudent(request, **kwargs):
    reg = kwargs.get('reg')
    student = Student.objects.get(reg_no=reg)
    student.delete()
    return redirect('home')
我々は今我々のURLを定義する必要があるので、私たちが何をしたかを見ることができます.
URLを作成します.あなたのアプリケーションのPYファイルと以下を含みます
from django.urls import path
from .views import CreateStudent,GetStudent, Delete

urlpatterns = [
    path('', CreateStudent, name='create_student'),
    path('std_detail/<str:reg>/', GetStudent, name='std_detail'),
    path('delete/<int:id>', Delete, name='delete'),
プロジェクトのURLに.Pyを追加し、次のように追加します.

from django.urls import path,include
urlpatterns = [
    path('', include("home.urls")),
    path('admin/', admin.site.urls),
]

それだ!プロジェクトを移行し、サーバーを実行します.
これで、単純なCRUDアプリケーションがあります.