اطلاعیه شماره 26 : به اطلاع کلیه کاربران وبسایت پایتونی ها می رساند به علت تداخلات شدید و محدودیت ها موجود در اینترنت کشور سرور های پایتونی ها با اختلال رو به رو شده که همکاران واحد فنی در حال بررسی موضوع هستند تا هرچه سریعتر مشکل را مرتفع کنند، لطفا صبور باشید.

021-71053903 [email protected] پشتیبانی از شنبه تا چهارشنبه ساعت 9 الی 16

آموزش فرم مدل ها در جنگو

آموزش فرم مدل ها در جنگو

مقدمه

با سلام خدمت شما مخاطبین خوب وبسایت پایتونی ها با یک مقاله آموزشی دیگه در خدمتتون هستیم از سری مقالات آموزشی طراحی وبسایت با جنگو در این مقاله می خواهیم بیشتر با فرم در جنگو آشنا شویم و استفاده های بیشتری از فرم ها در پروژه های خودمان داشته باشیم.

خوب در واقع Django ModelForms یک کلاس کمکی است که به شما امکان می دهد یک کلاس Form از یک مدل جنگو موجود ایجاد کنید.

واقعیته قضیه به این صورت که  پیچیده تر از آن چیزی است به نظر می رسد. ولی ما سعی در ساده سازیش داریم.

 

اول یک مدل جنگو بسازید

یک مدل به models.py اضافه کنید

mysite > main > models.py

from django.db import models

# Create your models here.

class Movie(models.Model):
    movie_title = models.CharField(max_length=150)
    release_year = models.IntegerField()
    director = models.CharField(max_length=100)
    movie_poster = models.ImageField(upload_to='images/', None=True)
    movie_plot = models.TextField()
    

    def __str__(self):
        return self.movie_title

 

مثال بالا مربوط به نحوه استفاده از مدل های جنگو است. این مدل شامل CharFields، IntegerField، ImageField و یک TextField است.

تابعی که در بالا قرار دارد عنوان فیلم را به عنوان نام نمایشی در ادمین باز می گرداند، بنابراین شناسایی هر شی مدل آسان است.

 

پروژه را برای بارگذاری رسانه ای باید پیکربندی کنید

mysite > mysite > settings.py

MEDIA_URL = '/media/'

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

 

در صورت داشتن ImageFieldیا FileFieldدر مدل های خود، یک URL برای آپلود فایل های رسانه ای جنگو در تنظیمات اضافه کنید.

mysite > mysite > urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings #add this
from django.conf.urls.static import static #add this

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

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

 

همچنین، یک مسیر URL برای فایل‌های رسانه در فایل mysite > urls.py اضافه کنید. متوجه خواهید شد که این تنظیمات فقط برای توسعه هستند.

 

 

Pillow را نصب کنید

خط فرمان ویندوز

(env) C:\Users\Owner\Desktop\Code\env\mysite> pip install Pillow

 

همچنین باید Pillow را برای پشتیبانی از فایل های رسانه ای نصب کنید.

 

Migrations را اجرا کنید

خط فرمان ویندوز

(env) C:\Users\Owner\Desktop\Code\env\mysite> py manage.py makemigrations
(env) C:\Users\Owner\Desktop\Code\env\mysite> py manage.py migrate

همچنین برای ایجاد مدل Movie و اعمال تغییرات به پایگاه داده باید migrate را انجام دهید.

 

مدل را در Django admin.py ثبت کنید

mysite > main > admin.py

from django.contrib import admin
from .models import Movie

# Register your models here.

admin.site.register(Movie)

اکنون مدل به پایگاه داده اضافه شده است، بنابراین آن را در فایل admin.py ثبت کنید تا آن را در پنل مدیریت جنگو مشاهده و به روز کنید.

البته برای دسترسی به صفحه مدیریت به یک اکانت superuser جنگو نیاز دارید. اگر در فرآیند مدیریت جنگو تازه کار هستید،  به نحوه استفاده از مدل های جنگو مراجعه کنید .

 

یک Django ModelForm ایجاد کنید

یک forms.py ایجاد کنید

mysite > main > (New File) forms.py

from django import forms

# Create your forms here.

 

در جنگو با فایل forms.py به صورت پیش فرض وجود ندارد، بنابراین باید فایل را در پوشه mysite > main ، همان دایرکتوری فایل را با نام models.py ایجاد کنید.

سپس می توانید formsاز جنگو در بالای مدل وارد کنید.

اکنون، به جای اعلام فیلدهای فرم جنگو مانند forms.CharField، بیایید مدل موجود خود را وارد کنیم.

زیرا اگر قبلاً متوجه نشده اید، فیلدهای مدل همان فیلدهایی هستند که ما برای فرم می خواهیم.

 

یک ModelForm ایجاد کنید

mysite > main > forms.py

from django import forms
from .models import Movie 


# Create your forms here.

 

لطفاً توجه داشته باشید، اسناد رسمی جنگو، ModelForms را در فایل models.pyModelForm قرار داده و  آن وارد از  django.formsمی‌کند. در عوض، اجازه دهید ModelForms خود را به فایل  forms.py اضافه کنیم.

من شخصاً این روش را ترجیح می دهم زیرا هر زمان که به دنبال فرم هستم مراجعه به فایل  forms.py برایم راحت تر است.

 

mysite > main > forms.py

from django import forms
from .models import Movie 


# Create your forms here.
class MovieForm(forms.ModelForm):

    class Meta:
        model = Movie
        fields = ('movie_title', 'release_year', 'director', 'movie_poster', 'movie_plot')

کلاس فرم خود را به نام ایجاد کنید MovieForm. کلاس Metaبرای تغییر رفتار ModelForm. در داخل آن، مدلی را که فیلدهای شما از آن می آیند و فیلدهایی را که می خواهید از آن مدل استفاده کنید، مشخص کنید.

شما می توانید انتخاب کنید که تمام فیلدها یا فقط تعداد کمی را اضافه کنید.

 

یک قالب جنگو برای فرم ایجاد کنید

اشیاء ModelForm و Model را باید Render بگیرید

mysite > mysite > views.py

from django.shortcuts import render, redirect
from .models import Movie
from .forms import MovieForm
from django.contrib import messages

# Create your views here.
def homepage(request):
    if request.method == "POST":
        movie_form = MovieForm(request.POST, request.FILES)
        if movie_form.is_valid():
            movie_form.save()
            messages.success(request, ('Your movie was successfully added!'))
        else:
            messages.error(request, 'Error saving form')
        
        
        return redirect("main:homepage")
    movie_form = MovieForm()
    movies = Movie.objects.all()
    return render(request=request, template_name="main/home.html", context={'movie_form':movie_form, 'movies':movies})

به فایل views.py خود بروید و یک شرط if را برای ارسال فرم اضافه کنید. مطمئن شوید که به request.FILESعنوان منابع داده های فایل را اضافه کنید وگرنه تصویر شما در فرم ذخیره نمی شود.

اگر فرم معتبر است، فرم را ذخیره کنید. سپس می توانید انتخاب کنید که  اگر فرم معتبر یا نامعتبر است، پیام جنگو بوت استرپ نشان داده شود.

اکنون، چون فرم a است MovieForm، با ذخیره فرم یک شی مدل جدید نیز به مدل اضافه می شود Movie. این کار باعث می‌شود که در مرحله بعد فرم و اشیاء مدل را به راحتی رندر کنیم.

 

اشیاء ModelForm و Model را رندر کنید

mysite > main > (New Folder) templates > (New Folder) main > (New File) home.html

<!DOCTYPE html>
<html>
  <head>
       <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

    <title>Django ModelForms</title>
    </head>
    <body>

      {% load crispy_forms_tags %}  

        
        <div class="container">
          <!--Django Model Form-->
          <h2 class="my-4">Add a new movie</h2>
          <form method="post" enctype="multipart/form-data">
            {% csrf_token %}
                {{movie_form|crispy}}
                <button class="btn btn-primary my-4" type="submit">Submit</button>
          </form>
          <!--Django Model-->
          <h2 class="my-4">Movies</h2>
          <div class="row">
            {% for m in movies %}
            <div class="col-lg-4 col-md-6 col-sm-12 pb-4">
              <div class="card h-100 p-4">
                <img src="{{ m.movie_poster.url }}" class="card-img-top" alt="{{ m.movie_title}}">
                <h4>{{m.movie_title}}</h4>
                <p class="text-muted">{{m.release_year}} | {{m.director}}</p>
                <p>{{m.movie_plot}}</p>
              </div>
            </div>
            {% empty %}
            <p>No movies added.</p>
            {% endfor %}
          </div>
        </div>
    

    <!-- Option 1: Bootstrap Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
    </body>
</html>

حالا بیایید قالب جنگو را بسازیم. این الگو دو کار را انجام می دهد:

  • رندر MovieForm و
  • رندر اشیاء مدل Movie به عنوان کارت.

این الگو از CDN Bootstrap 5.0.2 استفاده می کند.

شما باید اضافه کنید enctype="multipart/form-data"، به <form>. این برای اطمینان از اینکه فایل‌های آپلود شده، مانند ImageFieldو FileField، هنگام ارسال به سرور کدگذاری می‌شوند.

همچنین می‌خواهم به این نکته اشاره کنم که {% empty %}اگر آرایه خالی یا یافت نشد، می‌توانید از تگ الگو برای نمایش متن استفاده کنید.

 

خروجی پروژه

 

 

محمدرضا حسنی

224 مطلب منتشر شده

دانش آموخته رشته فناوری اطلاعات / موسس پایتونی ها

درباره این مطلب نظر دهید !

مطالب پرمخاطب پایتونی ها

Bootstrap چست

Bootstrap چیست ؟

7
دقیـقه مطالعه
ادامه ...

محصولات فروش پایتونی ها

%69
تخفیف

آموزش برنامه نویسی پایتون

35,000 تومان
6
%60
تخفیف

آموزش فیگما (Figma)

30,000 تومان
3