クルージングenジャンゴコンスラグ、2022


のクレアvamosは、クリアー国連は(作成、読み取り、更新、削除)B
要求する
テナー・パイソンInstalado , en caso de no tenerlo descargue e instale desde su p . gina : https://www.python.org/
インスラシア
Cerenzamos Instalando El Ororno仮想、パラエロabrimos CMD(sはmbolo del sistema)e ingresamos el siguiente comando pipをインストール
  • Creamos Nuna Carpeta La Cual Contendrは、エルproproecto、エヌMI Coco se Lilara Djangoクレー
  • abrimos cmd y nos ubicamos en la la pepeta creada
  • CreamosエルEntourno仮想コンエルエルComando Virtualenv env、Esto Nos sirve para la instalaciは、デDenendencias queレクイエールエステcrudです.
  • activamosエルentorno仮想コンエルcomando.\env\スクリプト\アクティブ
  • Instamamos djando con el siguiente comando pipはdjango == 4.0
  • をインストールします.
  • Creamos el proyecto con el siguiente comando django admin startproject nombreproyecto,en mi caso se llamar are mycrud
  • Accedemos Ala Carpeta del proyectoは、Cloud CD Mycrud
  • です
  • Creamos una Aplicaciは、n n con con el comando py管理します.Py startapp CRUD
  • levantamos el proyecto con el comando py管理Py runserver , accedemos ala web http://localhost:8000/

  • 設定を設定します.パイ
    Arimosヌエストロproyectoエヌnuestroエディタデtexto favorito、エヌmi caso estarは、usandoビジュアル・スタジオ・コードy abrimos el Archivoアンスセッティングを好みます.Pyらせんパラ配座AlGaunopopones
  • Definmos nuestra aplicaciは、en ' n en instendchenアプリAgregandoエルNombre ' crudです.アプリ."crudconfig ',

  • モデル.パイ
    Arimos el ArchivoモデルPy y Creamos Nuestro Modelo de la siguiente manera
    from django.db import models
    from django.utils.text import slugify
    
    class Developer(models.Model):
        name = models.CharField(max_length=50,null=True)
        age = models.IntegerField(null=True,blank=True)
        skill = models.CharField(max_length=50,null=True)
        slug = models.SlugField(null=True, blank=True)
    
        class Meta:
            verbose_name = 'Developer'
            verbose_name_plural = 'Developers'
    
        def __str__(self):
            return self.name
    
        def save(self, *args, **kwargs):
            if self.slug == None:
                slug = slugify(self.name)
    
                has_slug = Developer.objects.filter(slug=slug).exists()
                count = 1
                while has_slug:
                    count += 1
                    slug = slugify(self.name) + '-' + str(count) 
                    has_slug = Developer.objects.filter(slug=slug).exists()
    
                self.slug = slug
            super().save(*args, **kwargs)
    
    エヌEstere Modelo se Puede Observar SUS 4変数DE登録者como名、年齢、技能、スラグ、エステSolo Ltimoスラグは、可変変数que generara
    クレモロスla migraciとデルmodeloコンエルコマンパイソン管理.Py makemigrations

    y migramos con el comando python管理Py移動
    CRUDインテンシティビュー.パイ
    パラハッカーエルインプレッサエヌdjango nos状況は、アーカイブを見ます.Py y Ingresamos el Siguiente C didi digo
    from django.shortcuts import render, redirect
    from .models import *
    from django.contrib import messages
    
    # CRUD DEVELOPERS
    
    #------ Create ------
    
    def createDev(request):
        name = request.POST['nameInput']
        age = request.POST['ageInput']
        skill = request.POST['skillInput']
    
        developer = Developer.objects.create(
            name=name, age=age, skill=skill)
        messages.success(request, 'User: ' + name +' ¡Save Success !')
        return redirect('/')
    
    エヌエヌC ' d digo seの輸入アルツハイマーElemementos propios de djando que facalaran la creaci n ' d del crud,adem le s des mensajes tipo request para su interacci n . n
    URL.パイ
    パラディノンナ・ラ・ファンシオン・ヌ・ヌエストラ・ビザ・クリーム『アン・アーキヴォー』Py BajoラCarpetaは、y y ingresamosエルsiguiente c
    from django.urls import path
    from . import views
    
    urlpatterns = [
    
        # Urls Developers
        path('register/', views.createDev),
    
    ]
    
    y en nuestra URLPyプリンシパルque estaバヤla carpeta de mycrud se tiene el c c didi de la siguiente manera,misma que indica referencia ala direcci des n la la plulaci de n n crd

    プラティアリア
    <研究ノート>ナラ・プラトンの『基礎』についてバジョラカルペッタCRUD Creamos una Carpeta llamadaテンプレートエヌcuは、l contendrは、todosニュレスを文書化します.HTML
    建築構造研究所
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        {% load static %}
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>{% block title %} {% endblock %}</title>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
            integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
        <link rel="stylesheet" href="{% static 'css/style.css' %}">
    </head>
    
    <body>
        <nav class="navbar navbar-expand-lg navbar-light bg-dark">
            <a class="navbar-brand" href="#" style="color: white">Developers</a>
    
        </nav>
        <div class="container py-4">
            {% block body %}
    
            {% endblock %}
        </div>
        <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/umd/popper.min.js"
            integrity="sha384-9/reFTGAW83EW2RDu2S0VKaIzap3H66lZH81PoYlFhbGU+6BZp6G7niu735Sk7lN" crossorigin="anonymous">
        </script>
        <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js"
            integrity="sha384-w1Q4orYjBQndcko6MimVbzY0tgp4pWB4lZ7lr30WKz0vr/aWKhXdBNmNb5D92v7s" crossorigin="anonymous">
        </script>
        <script src="{% static 'js/bntButton.js' %}"></script>
    </body>
    
    </html>
    
    Paris Los Archivos CSS y JavaScript , Bajo el Archivo * Crud * se crea una napecarpe de nombre static y se tiene los siguientenarchivos :

    CADA Archivoにおける情報形式
    スタイル.CSS
    th,
    td {
      text-align: center;
      vertical-align: middle;
    }
    
    
    bntButton.js
    (function () {
    
        const btnDelete = document.querySelectorAll(".btnDelete");
    
        btnDelete.forEach(btn => {
            btn.addEventListener('click', (e) => {
                const confirmacion = confirm('¿Confirm to delete?');
                if (!confirmacion) {
                    e.preventDefault();
                }
            });
        });
    
    })();
    
    公式
    Nuestro Articario Ser la la Vista en la realal el registro , Prip Ee Peoplar se Ingresara desarrolladores O Programadores o nombre , Edad y habilidad o Linguaje de Programaci
    パラオエロCreamosは、文書en html en la la pepetaテンプレートエヌeste caso se llamarは、インデックスです.HTML詐欺に関する情報
    {% extends "./base.html" %}
    
    {% block title %} Form {% endblock %}
    
    {% block body %}
    <div class="row">
        <div class="col-sm-12 col-md-6 col-lg-4 col-xl-4">
            {% if messages %}
            {% for message in messages %}
            <div class="alert alert-dismissible alert-success">
                <button type="button" class="close" data-dismiss="alert">&times;</button>
                <strong class="text-dark">{{ message }}</strong>
            </div>
            {% endfor %}
            {% endif %}
            <h2>Form</h2>
            <div class="card">
                <div class="card-body">
                    <form action="/register/" method="POST">{% csrf_token %}
                        <div class="form-group">
                            <input type="text" id="nameInput" name="nameInput" class="form-control" placeholder="Name"
                                required>
                        </div>
                        <div class="form-group">
                            <input type="number" id="ageInput" name="ageInput" class="form-control" placeholder="Age"
                                maxlength="50" required>
                        </div>
                        <div class="form-group">
                            <input type="text" id="skillInput" name="skillInput" class="form-control" min="1" max="9"
                            placeholder="Skill" required>
                        </div>
                        <div class="form-group">
                            <button type="submit" class="btn btn-info btn-block text-white">Save</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    
    </div>
    {% endblock %}
    
    Lvantamos el servicio en cmd python管理Py runserver
    <研究ノート>テヘミズムの研究

    Realizamos国連登録

    結果

    AhoraビーンNosトッカモストラー、EdiTtar y Pirinar para Ero realizamosロスsiguientes cambios en cadaウノデロスArchivos que les menciona.
    ビューパイ
    from django.shortcuts import render, redirect
    from .models import *
    from django.contrib import messages
    
    
    # CRUD DEVELOPERS
    
    #------ Create ------
    
    def createDev(request):
        name = request.POST['nameInput']
        age = request.POST['ageInput']
        skill = request.POST['skillInput']
    
        developer = Developer.objects.create(
            name=name, age=age, skill=skill)
        messages.success(request, 'User: ' + name +' ¡Save Success !')
        return redirect('/')
    
    
    #------ List ------
    def listDev(request):
        developers = Developer.objects.all()
        return render(request, "index.html", {"developers": developers})
    
    
    #------ Edit ------
    def editDev(request, slug):
        developer = Developer.objects.get(slug=slug)
    
        name = request.POST.get('nameInput')
        age = request.POST.get('ageInput')
        skill = request.POST.get('skillInput')
        if request.method == 'POST':
    
            developer.name = name
            developer.age = age
            developer.skill = skill
            developer.save()
            messages.success(request, 'User: ' + name +' ¡Edit Success!')
            return redirect('/')
    
        return render (request, "edit.html", {"developer": developer})
    
    #------ Delete ------
    def deleteDev(request, slug):
        developer = Developer.objects.get(slug=slug)
    
        developer.delete()
        messages.success(request, '¡Developer Deleted!')
        return redirect('/')  
    
    URL.パイ
    エルqueエスタBajoラCarpetaクルード
    from django.urls import path
    from . import views
    
    urlpatterns = [
    
        # Urls Developers
        path('', views.listDev),
        path('register/', views.createDev),
        path('edit/<slug:slug>', views.editDev, name='editUrl'),
        path('delete/<slug:slug>', views.deleteDev, name='deleteUrl'),
    
    ]
    
    インデックス.HTML
    {% extends "./base.html" %}
    
    {% block title %} Form {% endblock %}
    
    {% block body %}
    <div class="row">
        <div class="col-sm-12 col-md-6 col-lg-4 col-xl-4">
            {% if messages %}
            {% for message in messages %}
            <div class="alert alert-dismissible alert-success">
                <button type="button" class="close" data-dismiss="alert">&times;</button>
                <strong class="text-dark">{{ message }}</strong>
            </div>
            {% endfor %}
            {% endif %}
            <h2>Form</h2>
            <div class="card">
                <div class="card-body">
                    <form action="/register/" method="POST">{% csrf_token %}
                        <div class="form-group">
                            <input type="text" id="nameInput" name="nameInput" class="form-control" placeholder="Name"
                                required>
                        </div>
                        <div class="form-group">
                            <input type="number" id="ageInput" name="ageInput" class="form-control" placeholder="Age"
                                maxlength="50" required>
                        </div>
                        <div class="form-group">
                            <input type="text" id="skillInput" name="skillInput" class="form-control" min="1" max="9"
                            placeholder="Skill" required>
                        </div>
                        <div class="form-group">
                            <button type="submit" class="btn btn-info btn-block text-white">Save</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
        <div class="col-sm-12 col-md-6 col-lg-8 col-xl-8">
            <h1>Developer List</h1>
            <div class="table-responsive py-2">
                <table class="table table-striped table-hover">
                    <thead class="bg-info">
                        <tr class="text-light">
                            <th>#</th>
                            <th>Name</th>
                            <th>Age</th>
                            <th>Skills</th>
                            <th colspan="2"> options</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for dev in developers %}
                        <tr>
                            <td>{{forloop.counter}}</td>
                            <td>{{dev.name}}</td>
                            <td>{{dev.age}}</td>
                            <td>{{dev.skill}}</td>
                            <td><a href="{%  url 'editUrl' dev.slug %}" class="btn btn-info">Edit</a></td>
                            <td><a href="{%  url 'deleteUrl' dev.slug %}" class="btn btn-danger btnDelete">Delete</a></td>
                        </tr>
                        {% endfor %}
                    </tbody>
                </table>
            </div>
        </div>
    </div>
    {% endblock %}
    
    
    パラエルEditar Creamos Otro Documentto HTML詐欺エルnombreデ編集.HTML、エスタBajoラCarpetaテンプレートy ingresamos
    {% extends "./base.html" %}
    
    {% block title %} Edit {% endblock %}
    
    {% block body %}
    <div class="row">
        <div class="col-md-4 offset-md-4">
            <h2>Edit</h2>
            <div class="card">
                <div class="card-body">
                    <form action="{% url 'editUrl' developer.slug %}"  method="POST">
                        {% csrf_token %}
                        <div class="form-group">
                            <input type="text" id="nameInput" name="nameInput" value="{{developer.name}}" class="form-control" placeholder="Name"
                                required>
                        </div>
                        <div class="form-group">
                            <input type="number" id="ageInput" name="ageInput" value="{{developer.age}}" class="form-control" placeholder="Age"
                                maxlength="50" required>
                        </div>
                        <div class="form-group">
                            <input type="text" id="skillInput" name="skillInput" value="{{developer.skill}}" class="form-control"
                            placeholder="Skill"required>
                        </div>
                        <div class="form-group">
                            <button type="submit" class="btn btn-success btn-block text-white">Edit</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
    {% endblock %}
    
    カエデエロスCambios Ya SE TieneエルCrud Completo、連続しているles muestro como queda.

    クレモスノ

    エディタノス


    スラッグ
    se puede ver lo lo que hace el slg que reemza nuestro id por una valor unico en este caso el nombre,esto ayuda mucho para temas de seguridad ya que con esto se oculta el id ala que perpercese el registro

    エリミモスノ


    エスペロque les ayude ...
    ヒュイツ
    https://docs.djangoproject.com/en/4.0/