اذهب إلى المحتوى

السؤال

نشر

كنت من فترة أقرأ في توثيق جانغو Django ، ووجدت أن هناك نوعين من الإستمارات Forms، النوع الأول هو forms.Form والآخر forms.ModelForm

لكن لم أفهم ما الفرق بين النوعين، هل يمكن لأي شخص أن يشرح لي أوجه التشابه والاختلاف بين هذين النوعين؟ ومتى أستعمل كل نوع منهما؟

Recommended Posts

  • 1
نشر

ال forms.ModelForm هو نموذج يتم إنشاؤه تلقائيًا بناءً على model معين مثلا دعنا نقول أن لديك نموذج مقال يشبه هذا

class Article(models.Model):
    DRAFT = 'D'
    PUBLISHED = 'P'
    STATUS = (
        (DRAFT, 'Draft'),
        (PUBLISHED, 'Published'),
    )
    title = models.CharField(max_length=255)
    content = models.TextField(max_length=4000)
    status = models.CharField(max_length=1, choices=STATUS, default=DRAFT)
    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(blank=True, null=True)

في ملف Forms.py الخاص بك ، يمكنك إنشاء نماذجك تلقائيًا مثل ذلك

from django import forms
from . import models

class ArticleForm(forms.ModelForm):
    class Meta:
        model = models.Article
        fields = ['title', 'content', 'status']

يجب أن يحتوي modelForm على modelللعمل منه ، في المثال أعلاه يمكنك رؤية هذا السطر

"model = Models.Article" # هنا نحدد النموذج الذي سيعتمد عليه هذا النموذج

اما النوع الثاني forms.Form هي أشكال مستقلة عن model ولا تتفاعل بشكل مباشر معه و هذا مثال form للبحث

from django import forms

class SearchForm(forms.Form):
    search_term = forms.CharField(required=False, max_length=50)

كما ترى ، فإن نموذج البحث أعلاه ليس مرتبطًا بنموذج معين ، فهو مستقل وهدفه الوحيد هو إنشاء حقول أو حقل إذا كان لديك حقل واحد فقط مثل نموذج البحث أعلاه والذي سيتم تقديمه للمستخدم النهائي.

يتمثل الاختلاف الرئيسي بين الاثنين في أنه في النماذج التي يتم إنشاؤها من النماذج ، يجب علينا تحديد النموذج الذي سيتم استخدامه لإنشاء النموذج الخاص بنا.

  • 1
نشر

هناك 3 أنواع من طرق التعامل مع Forms في Django 

الطريقة الأولى : هي ال class الذي يُكتب في ملف forms.py و الذي يرث من forms.ModelForm بالإضافة لكتابة اسم النموذج Model الذي تريد تحويلة إلى Forms وذلك بعد إستدعاؤه و هذا النوع هدفه الأول هو تحويل النماذج models إلى forms بدلاً من كتابتها من جديد مثال :

from django import forms
from .models import Volunteering

class VolunteeringForm(forms.ModelForm):
    class Meta :
        model  = Volunteering
        fields = ['name' , 'phone' , 'email' , 'national_id' , 'address']
        labels = {
            'name'  : ('Name | الأسم'),
            'phone' : ('Phone | الهاتف'),
            'email' : ('Email | البريد الإلكتروني'),
            'national_id' : ('National ID | الرقم القومي'),
            'address' : ('Address | العنوان'),
        }
       

الطريقة الثانية : هي إنشاء Forms خاصة عن طريق class يرث من forms.Form بشكل مباشر على سبيل المثال :

from django import forms

class VolunteerForm(forms.Form):
    name = forms.CharField(max_length=100)
    phone = forms.IntegerField()
    email = forms.EmailField()
    national_id = forms.CharField(max_length = 14)
    address = forms.CharField(max_length=200)

الطريقة الثالثه و هي لا ترتبط بملف forms.py او models.py و إنما إنشاء نماذج خاصة في ملف الـ HTML Template و إستقبال البيانات من تلك النماذج على ملف views.py عن طريق كتابة الأمر ذلك على سبيل المثال تريد استقبال بيانات ذلك النموذج من ملف HTML

<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

في تلك الحاله يجب إستخدام الأمر التالي في ملف views.py من أجل إستقبال البيانات من نموذج HTML عن طريق الأمر cleaned_data.get 

name = form.cleaned_data['name']

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...