با عرض سلام و وقت بخیر خدمت کاربران محترم سایت ویرگول، در این مقاله آموزشی که چکیده آموزش جنگو ORM از سایت Django documentation بهمراه مطالب تکمیلی تر , سعی شده یک آموزش کاربردی و پروژه محور از جنگو ORM ارایه گردد.ایده این سری مقاله های آموزشی از این موضوع سرچشمه می گیرد که بخشی از خوانندگان وجود دارد که به محتوای نوشتاری آنلاین بهتر پاسخ می دهند و ترجیج می دهند مهارت های جدید را به سرعت از طریق خواندن افزایش دهند.این سری آموزش ها با ارایه اولین پکیج آموزشی در خصوص جنگو آغاز می شود که انتظار می رود با واکنش مثبت کاربران همراه شود.
توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل میشود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا میکنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم. با کمال تشکر جواد جهانگیری
شماره تلفن همراه: 09149431772
نشانی پست الکترونیکی: javad.jahangiri.niopdc@gmail.com
فیلمهای آموزشی در آپارات:جواد جهانگیری (CTO) - آپارات
فیلم آموزشی در یوتویب: javad jahangiri - YouTube
نسخه مقاله: ۱.۱ - تاریخ بروزرسانی: 1401/02/01
برای دیدن فیلم اموزشی مربوطه به کانال آپاراتی بنده به ادرس جواد جهانگیری (CTO) - آپارات مراجعه نمایید
سورس این پروژه در گیت هاب بنده به ادرس زیر موجود می باشد
https://github.com/javadjahangiriniopdc/DjangoCrudExample
یک پروژه Django ایجاد می کنیم
یک app جدید بنام employee ایجاد می کنیم
در فایل settingنسبت به اضافه کردن app جدید اقدام می کنیم
با عنایت به اینکه می خواهیم در این پروژه از دیتابیس MySQL استفاده کنیم ابتدا نسبت به نصب VisualCppRedist_AIO_x86_x64 از سایت soft98 اقدام می کنیم
Microsoft Visual C++ Runtime
برخی نرم افزارها که با استفاده از کتابخانه ها و Component های زبان ++Visual C نوشته شده اند، به طور عادی بر روی سیستم اجرا نمیشوند و با ارورهایی مانند MSVCP120.dll و MSVCP140.dll و VCRUNTIME و... مواجه میشوید و برای اجرا نیازمند تعدادی فایل هستند که باید بر روی سیستم موجود باشد. Microsoft Visual C++ Runtime در حقیقت تعدادی فایل مورد نیاز سیستم عامل است تا بتواند برنامه های نوشته شده تحت این زبان ها را اجرا کند
سپس نسبت به نسب WampServer بر روی ویندوز از سایت soft98 اقدام می کنیم نصب ان ساده بود فقط دقت شود که با عنایت به اینکه برای کار نیاز به Microsoft Visual C++ Runtime دارد حتما قبل از نصب مطابق اموزش اقدام شود.
WampServer
یکی از بهترین و قدیمی ترین نرم افزارهای لوکال ساز محسوب میشود این نرم افزار یک نرم افزار برای راه اندازی IIS لینوکس هست که شما بوسیله آن میتوانید فایل های پی اچ پی را اجرا و نتیجه آن را ببینید . شما میتوانید توسط این نرم افزار همه اسکریپت های PHP را بر روی لوکال تست نمایید.
برخی ویژگی های WampServer
قابلیت سوئیچ بین تمامی نسخه های Php MySQL Apache
امکان مدیریت تمام سرویس های نصب شده
امکان دسترسی به تمام ماژول های php و قابلیت فعال یا غیر فعال سازی هر یک از آنها تنها با یک کلیک
امکان دسترسی به تنظیمات هر کدام از سرویس ها
قابلیت اسفاده از بانک اطلاعاتی sqlitemanager
قابلیت استفاده از phpmyadmin برای مدیریت بانک های اطلاعاتی
و ....
نصب WampServer ساده بود و به گزینه پیش فرض پسند کرده و نصب را تا اخرین مرحله ادامه دهید درصورتی که عملیات صحیح باشد بعد از اجرای WampServer می بایستی ایکون ان در کنار ساعت ویندوز به رنگ سبز باشد اگر به رنگ نارنجی باشد به این معنی هست که یکی از سرویس ها بدرستی اجرا نشده است با عنایت به اینکه اکثر دانت کور کار ها معمولا بر روی سیستم خود IIS را فعال می کند پورت 80 برای این سرور تخصیص داده می شود و هنگام که سرویس Appache می خواهد راه اندازی شود این پورت use است لذا بر روی ایکون WampServer مطابق شکل راست کلیک کرده و نسبت به تغییر پورت اقدام می کنیم
معمولا پورت را به 8080 تغییر می دهیم
درنهایت اگر عملیات به درستی انجام شود ایکون WampServer به شکل سبز خواهد بود
با عنایت به اینکه در این اموزش هدف اموزش MySQL نیست و در صورت نیاز به اموزش MySQL از اپارات بنده از دوره اموش کاردی و پروژه محور MySQL استفاده نمایید
یک دیتابیس جدید بنام djangodb با Collation از نوع utf8_general_ci اقدام می کنیم :
سپس مجدد به پروژه Django خود برگشته و فایل تنظیمات دیتابیس پیش فرض را به شکل زیر تغییر می دهیم
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djangodb', 'USER': 'root', 'PASSWORD': 'mysql', 'HOST': 'localhost', 'PORT': '3306' } }
پیشنهاد می شود برای درک بهتر این اموزش ابتدا از دوره های رایگان بنده در اپارت به شرح زیر استفاده شود
مطابق اموزش های ارایه شده می بایستی در این مرحله نسبت به نسبت mysqlclient اقدام شود
ایجاد مدل Employee
وارد فایل models.py در APP جدید ایجاد شده می شود و یک مدل بنام Employee را ایجاد می کنیم:
from django.db import models class Employee(models.Model): eid = models.CharField(max_length=20) ename = models.CharField(max_length=100) eemail = models.EmailField() econtact = models.CharField(max_length=15) class Meta: db_table = "employee"
نسبت به makemigration و در ادامه migrate پروژه اقدام می کنیم
یک کاربر superuser نیز برای ورود به پنل ادمین ایجاد می کنیم
در ادامه نسبت به رجیستر کردن مدل کارمند در admin Panel جنگو به شکل زیر اقدام می کنیم
from django.contrib import admin # Register your models here. from employee.models import Employee admin.site.register(Employee)
وارد پنل admin شده و چندین رکورد برای مدل Employee اقدام می کنیم
یک فایل یک فرم بنام forms.py به پروژه اضافه می کنیم
froms.py
from django import forms from employee.models import Employee class EmployeeForm(forms.ModelForm): class Meta: model = Employee fields = "__all__"
در داخل پوشه employee یک فایل بنام employee/urls.py ایجاد می کنیم و سپس به شرح ذیل ان را در داخل urls.py ایجاد می کنیم:
urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('employee.urls')) ]
در داخل app کارمند ایجاد شده پوشه های templates و static را به شرح ذیل ایجاد می کنیم:
یک فایل index.html در مسیر employee/templates/employee/index.html ایجاد می کنیم
##employee/templates/employee/index.html
<!DOCTYPE html> {% load static %} <html lang="en"> <head> <meta charset="UTF-8"> <title>Index</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"> <link rel="stylesheet" href="{% static 'employee/css/style.css' %}"/> </head> <body> <form method="POST" class="post-form" action="/emp"> {% csrf_token %} <div class="container"> <br> <div class="form-group row"> <label class="col-sm-1 col-form-label"></label> <div class="col-sm-4"> <h3>Enter Details</h3> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Id:</label> <div class="col-sm-4"> {{ form.eid }} </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Name:</label> <div class="col-sm-4"> {{ form.ename }} </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Email:</label> <div class="col-sm-4"> {{ form.eemail }} </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Contact:</label> <div class="col-sm-4"> {{ form.econtact }} </div> </div> <div class="form-group row"> <label class="col-sm-1 col-form-label"></label> <div class="col-sm-4"> <button type="submit" class="btn btn-primary">Submit</button> </div> </div> </div> </form> </body> </html>
یک فایل show.html نیز در مسیر employee/templates/employee/show.html ایجاد می کنیم
##employee/templates/employee/show.html
<!DOCTYPE html> {% load static %} <html lang="en"> <head> <meta charset="UTF-8"> <title>Employee Records</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"> <link rel="stylesheet" href="{% static 'employee/css/style.css' %}"/> </head> <body> <table class="table table-striped table-bordered table-sm"> <thead class="thead-dark"> <tr> <th>Employee ID</th> <th>Employee Name</th> <th>Employee Email</th> <th>Employee Contact</th> <th>Actions</th> </tr> </thead> <tbody> {% for employee in employees %} <tr> <td>{{ employee.eid }}</td> <td>{{ employee.ename }}</td> <td>{{ employee.eemail }}</td> <td>{{ employee.econtact }}</td> <td> <a href="/edit/{{ employee.id }}"><span class="glyphicon glyphicon-pencil">Edit</span></a> <a href="/delete/{{ employee.id }}">Delete</a> </td> </tr> {% endfor %} </tbody> </table> <br> <br> <center><a href="/emp" class="btn btn-primary">Add New Record</a></center> </body> </html>
یک فایل show.html نیز در مسیر employee/templates/employee/edit.html ایجاد می کنیم
##employee/templates/employee/edit.html
{% load static %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Index</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"> <link rel="stylesheet" href="{% static 'employee/css/style.css' %}"/> </head> <body> <form method="POST" class="post-form" action="/update/{{ employee.id }}"> {% csrf_token %} <div class="container"> <br> <div class="form-group row"> <label class="col-sm-1 col-form-label"></label> <div class="col-sm-4"> <h3>Update Details</h3> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Id:</label> <div class="col-sm-4"> <input type="text" name="eid" id="id_eid" required maxlength="20" value="{{ employee.eid }}"/> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Name:</label> <div class="col-sm-4"> <input type="text" name="ename" id="id_ename" required maxlength="100" value="{{ employee.ename }}"/> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Email:</label> <div class="col-sm-4"> <input type="email" name="eemail" id="id_eemail" required maxlength="254" value="{{ employee.eemail }}"/> </div> </div> <div class="form-group row"> <label class="col-sm-2 col-form-label">Employee Contact:</label> <div class="col-sm-4"> <input type="text" name="econtact" id="id_econtact" required maxlength="15" value="{{ employee.econtact }}"/> </div> </div> <div class="form-group row"> <label class="col-sm-1 col-form-label"></label> <div class="col-sm-4"> <button type="submit" class="btn btn-success">Update</button> </div> </div> </div> </form> </body> </html>
در داخل پوشه employee/static/employee یک پوشه بنام css ایجاد کرده و یک فایل style.css در این پوشه ایجاد می کنیم
##employee/static/employee/css/style.css
body { font: 12px/1.4 Verdana, Arial; background: #eee; height: 100%; margin: 25px 0; padding: 0 } h1 { font: 24px Georgia, Verdana; margin: 0 } h2 { font-size: 12px; font-weight: 400; font-style: italic; margin: 0 0 20px } p { margin-top: 0 } ul { margin: 0; padding-left: 20px } #testdiv { width: 600px; margin: 0 auto; border: 1px solid #ccc; padding: 20px 25px; background: #fff } #tinybox { position: absolute; display: none; padding: 10px; background: #fff url(images/preload.gif) no-repeat 50% 50%; border: 10px solid #e3e3e3; z-index: 2000 } #tinymask { position: absolute; display: none; top: 0; left: 0; height: 100%; width: 100%; background: #000; z-index: 1500 } #tinycontent { background: #fff } .button { font: 14px Georgia, Verdana; margin-bottom: 10px; padding: 8px 10px 9px; border: 1px solid #ccc; background: #eee; cursor: pointer } .button:hover { border: 1px solid #bbb; background: #e3e3e3 }
دقت شود بوت استرپ در فایل index.html به شکل زیر در بالا بارگذاری شده است
در فایل employee/urls.py نسبت به تعریف روتینگ به شرح ذیل اقدام می کنیم
##employee/urls.py
from django.contrib import admin from django.urls import path, include from employee import views urlpatterns = [ path('', views.show), path('emp', views.emp), path('show', views.show), path('edit/<int:id>', views.edit), path('update/<int:id>', views.update), path('delete/<int:id>', views.destroy), ]
سپس فایل employee/views.py به شرح ذیل تعریف می کنیم
##employee/views.py
from django.shortcuts import render # Create your views here. from django.shortcuts import render, redirect from employee.forms import EmployeeForm from employee.models import Employee # Create your views here. def emp(request): if request.method == "POST": form = EmployeeForm(request.POST) if form.is_valid(): try: form.save() return redirect('/show') except: pass else: form = EmployeeForm() return render(request, 'employee/index.html', {'form': form}) def show(request): employees = Employee.objects.all() return render(request, "employee/show.html", {'employees': employees}) def edit(request, id): employee = Employee.objects.get(id=id) return render(request, 'employee/edit.html', {'employee': employee}) def update(request, id): employee = Employee.objects.get(id=id) form = EmployeeForm(request.POST, instance=employee) if form.is_valid(): form.save() return redirect("/show") return render(request, 'employee/edit.html', {'employee': employee}) def destroy(request, id): employee = Employee.objects.get(id=id) employee.delete() return redirect("/show")
نمونه از صفحه ویرایش اطلاعات
حذف اطلاعات
در دوره های آموزش تضمینی مجتمع فنی ارومیه که به صورت خصوصی و عمومی در دو شیوه حضوری و آنلاین برگزار می شود سرفصل های بسیار متنوع و کاربردی را بصورت پروژه محور آموزش داده می شود تا شخص کارآموز بتواند بلافاصله پس از اتمام این دوره در کمترین زمان ممکن وارد بازار کار شود.
آموزش تخصص ماست با ما حرفه ای شوید
جهت مشاوره با شماره 09149431772 در ارتباط باشید ...