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

كيف احفظ قيمة form من الحذف في django؟

Abdulazeez Altameemi

السؤال

لدي عدة ادخالات وكل ادخال له form خاص به 

لما اقوم بأدخال قيمة في ادخال معين يقوم بحذف قيم الادخالات السابقة ويرجع قيمتهم None 

ممكن طريق احافظ على القيم السابقة لكل ادخال 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

سأقوم بشرح تسلسل طريقة عمل فورم إدخال و حفظ البيانات بطريقة الصحيحة.
لكن أربد منك أن ترفق الكود الخاص بك لمعرفة المشكلة. قد يساعدك لمعرفة المشكلة الخاصة بك
سوف أقوم بشرح على مثال أنه لديك منشورات تريد حفظها:
في ملف models.py  قمنا بإنشاء جدول البيانات.

class Post(models.Model):
    headline = models.CharField(max_length=200)
    sub_headline = models.CharField(max_length=200, null=True, blank=True)
    thumbnail = models.ImageField(null=True, blank=True, upload_to="images", default="/images/placeholder.png")
    body = RichTextUploadingField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)
    featured = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag, null=True, blank=True)
    slug = models.SlugField(null=True, blank=True)
    
    def __str__(self):
      return self.headline

و الأن الى ملف forms.py حتى نقوم بعمل فورم استقبال البيانات Post:
حيث هنا حددنا أن كل العناصر التي في model , Post سيتم إدخالها عنطريق المستخدم:

class PostForm(ModelForm):

    class Meta:
        model = Post
        fields = '__all__'

و بعدها في ملف views.py: هنا سوف نستقبل request القادم من فورم عند إرسال البيانات وفحص هل هو من نوع POST و نستقبل كل من ملفات المرفقة و النصوص . سيكون شرح دخل الكود.

@login_required(login_url="home")
def createPost(request):
    form = PostForm()

    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES) # استقبال كل من ملفات و البينات المرسلة
        if form.is_valid(): # فحص وجود ببيانات
            form.save() #حفظ البيانات في قاعدة البيانات 
        return redirect('posts') # الرجوع لصفحة محددة

    context = {'form': form}
    return render(request, 'base/post_form.html', context)


و الأن مع شكل الفورم في ملف  post_form.html:
وهكذا يكون إنتهيت من كل النقاط الازمة لعمل فوم و حفظ بيانات الخاصة به:

<div class="main-container">
	<a class="btn btn-sm btn-primary" href="{% url 'posts' %}">&laquo Back to Posts</a>
	
	<form action="" method="POST" enctype="multipart/form-data">
		{% csrf_token %}
		{{form.media}}

		{{form|crispy}}
		<input class="btn btn-primary" type="submit" value="Submit Post">
		
	</form>
</div>

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال محمد حجي2:

سأقوم بشرح تسلسل طريقة عمل فورم إدخال و حفظ البيانات بطريقة الصحيحة.
لكن أربد منك أن ترفق الكود الخاص بك لمعرفة المشكلة. قد يساعدك لمعرفة المشكلة الخاصة بك
سوف أقوم بشرح على مثال أنه لديك منشورات تريد حفظها:
في ملف models.py  قمنا بإنشاء جدول البيانات.


class Post(models.Model):
    headline = models.CharField(max_length=200)
    sub_headline = models.CharField(max_length=200, null=True, blank=True)
    thumbnail = models.ImageField(null=True, blank=True, upload_to="images", default="/images/placeholder.png")
    body = RichTextUploadingField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    active = models.BooleanField(default=False)
    featured = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag, null=True, blank=True)
    slug = models.SlugField(null=True, blank=True)
    
    def __str__(self):
      return self.headline

و الأن الى ملف forms.py حتى نقوم بعمل فورم استقبال البيانات Post:
حيث هنا حددنا أن كل العناصر التي في model , Post سيتم إدخالها عنطريق المستخدم:


class PostForm(ModelForm):

    class Meta:
        model = Post
        fields = '__all__'

و بعدها في ملف views.py: هنا سوف نستقبل request القادم من فورم عند إرسال البيانات وفحص هل هو من نوع POST و نستقبل كل من ملفات المرفقة و النصوص . سيكون شرح دخل الكود.


@login_required(login_url="home")
def createPost(request):
    form = PostForm()

    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES) # استقبال كل من ملفات و البينات المرسلة
        if form.is_valid(): # فحص وجود ببيانات
            form.save() #حفظ البيانات في قاعدة البيانات 
        return redirect('posts') # الرجوع لصفحة محددة

    context = {'form': form}
    return render(request, 'base/post_form.html', context)


و الأن مع شكل الفورم في ملف  post_form.html:
وهكذا يكون إنتهيت من كل النقاط الازمة لعمل فوم و حفظ بيانات الخاصة به:


<div class="main-container">
	<a class="btn btn-sm btn-primary" href="{% url 'posts' %}">&laquo Back to Posts</a>
	
	<form action="" method="POST" enctype="multipart/form-data">
		{% csrf_token %}
		{{form.media}}

		{{form|crispy}}
		<input class="btn btn-primary" type="submit" value="Submit Post">
		
	</form>
</div>

 

اخي الكريم 

هذا الشيفرة التي استخدمها 

انا استقبل ارقام من المستخدم و اقوم بحل معادلة وعرض حل المعادلة للمستخدم 

def math(request):
    asphalt_singles = request.GET.get('asphalt_singles')
    membrane = request.GET.get('Membrane')
    sheathing = request.GET.get('Sheathing')
    roof_trusses = request.GET.get('Roof Trusses')
    poly_vapour_barrier = request.GET.get('Poly Vapour Barrier')
    
    # حل المعادلات
    asphalt_singles1 = float(asphalt_singles) * 20.9
    membrane1 = float(membrane) * 20.9
    sheathing1 = 40 * (0.625 / 12)
    roof_trusses1 = float(roof_trusses) * 20.9
    poly_vapour_barrier1 = poly_vapour_barrier * 20.9 + (membrane1 / asphalt_singles1)
    
    context = { 
        'asphalt_singles': asphalt_singles1,
        'membrane': membrane1,
        'sheathing': sheathing1,
        'roof_trusses': roof_trusses1,
        'poly_vapour_barrier': poly_vapour_barrier1,
    }
    return render(request, 'html_pages/math.html', context)

المدخلات لدي على شكل جدول

في كل input استخدمت form حتى استطيع ارسال input واحد فقط 

<tbody>
          <tr>
            <td></td>
            <td>Asphalt Singles</td>
            <td>
              <form method="get"><input style="width: 45px;" type="numeric" name="asphalt_singles"
                  value="{{ asphalt_singles_input_value }}"></form>
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{asphalt_singles1}}</td>
            <td>PSF</td>
          </tr>
          <tr>
            <td></td>
            <td>Membrane</td>
            <td>
              <form method="get"><input style="width: 45px;" type="numeric" name="Membrane"
                  value="{{membrane_input_value}}"></form>
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{membrane}}</td>
            <td>PSF</td>
          </tr>
          <tr>
            <td></td>
            <td>5/8" Sheathing</td>
            <td style="color: rgb(42, 178, 246);">
              <form method="get"><input style="width: 45px;" type="numeric" name="Sheathing"
                  value="{{sheathing_input_value}}"></form>
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{sheathing}}</td>
            <td>PSF</td>
          </tr>
          <tr>
            <td></td>
            <td>Roof Trusses</td>
            <td style="color: rgb(42, 178, 246);">
              <form method="get"><input style="width: 45px;" type="numeric" name="Roof Trusses"
                  value="{{roof_trusses_input_value}}"></form>
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{roof_trusses}}</td>
            <td>PSF</td>
          </tr>
          <tr>
            <td></td>
            <td>6mil Poly Vapour Barrier</td>
            <td style="color: rgb(42, 178, 246);">
              <form method="get"><input style="width: 45px;" type="numeric" name="Poly Vapour Barrier"
                  value="{{poly_vapour_barrier_input_value}}"></form>
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{poly_vapour_barrier}}</td>
            <td>PSF</td>
          </tr>
</tbody>

المشكلة لما اقوم بأدخال قيمة في input يقوم بحذف القيم السابقة من inputs ويرجع None

وبذلك يحدث خطأ من نوع TypeError في حل المعادلات

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لقد قمت بعدد من التعديلات على الكود الخاص بك حتى بعمل بشكل المطلوب حسب ما مفهمت منك:

أولاً قمت بتحويل كل إدخالات في form واحد و من ثم تغير نوعه من get ل POST ومن ثم إضافة زر إرسال لكل الحقول:
و أصبح بهذا الشكل:
 

<div>
    <tr>

            <td>Asphalt Singles</td>

              <form method="POST">
                  {% csrf_token %}
                  {{form.media}}

                  {{form|crispy}}
                  <input style="width: 45px;" type="numeric" name="asphalt_singles"
                         value="{{ asphalt_singles_input_value }}">

            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{asphalt_singles1}}</td>
            <td>PSF</td>

          <
            <td></td>
            <td>Membrane</td>
            <td>
             <input style="width: 45px;" type="numeric" name="Membrane"
                  value="{{membrane_input_value}}">
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{membrane}}</td>
            <td>PSF</td>


            <td></td>
            <td>5/8" Sheathing</td>
            <td style="color: rgb(42, 178, 246);">
              <input style="width: 45px;" type="numeric" name="Sheathing"
                  value="{{sheathing_input_value}}">
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{sheathing}}</td>
            <td>PSF</td>


            <td></td>
            <td>Roof Trusses</td>
            <td style="color: rgb(42, 178, 246);">
              <input style="width: 45px;" type="numeric" name="Roof Trusses"
                  value="{{roof_trusses_input_value}}">
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{roof_trusses}}</td>
            <td>PSF</td>


            <td></td>
            <td>6mil Poly Vapour Barrier</td>
            <td style="color: rgb(42, 178, 246);">
              <input style="width: 45px;" type="numeric" name="Poly Vapour Barrier"
                  value="{{poly_vapour_barrier_input_value}}">

                <input class="btn btn-primary" type="submit" value="Submit Post">
              </form>
            </td>
            <td>kPa</td>
            <td style="color: rgb(247, 10, 10)">{{poly_vapour_barrier}}</td>
            <td>PSF</td>
          </tr>
</div>

بنسبة لملف views.py:
قمت بتغير طريقة استقبال البيانات حتى لا تصل لي فارغة:
و أصبحت كتالي:

def math(request):
    asphalt_singles = request.POST.get('asphalt_singles')
    print(asphalt_singles)
    membrane = request.POST.get('Membrane') # هنا تم تغير طريقة استقبال البيانات
    sheathing = request.POST.get('Sheathing')
    roof_trusses = request.POST.get('Roof Trusses')
    poly_vapour_barrier = request.POST.get('Poly Vapour Barrier')

    asphalt_singles1 = float(asphalt_singles) * 20.9
    membrane1 = float(membrane) * 20.9
    sheathing1 = 40 * (0.625 / 12)
    roof_trusses1 = float(roof_trusses) * 20.9
    poly_vapour_barrier1 = float(poly_vapour_barrier) * 20.9 + ( float(membrane1) / float(asphalt_singles1)) # وبعض التعديلات هنا

    context = {
        'asphalt_singles': asphalt_singles1,
        'membrane': membrane1,
        'sheathing': sheathing1,
        'roof_trusses': roof_trusses1,
        'poly_vapour_barrier': poly_vapour_barrier1,
    }
    print(context)
    return render(request, 'html_pages/math.html', context)

قمت بتجربة الكود وتم طباعة context و كانت كل البيانات ظاهرة بدون مشاكل.
لا تقم بستخدام get لإرسال البيانات بل POST لأن get تستخدم لستقبال البيانات.

تم التعديل في بواسطة محمد حجي2
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

في حال كنت تريد إرسال عنصر واحد فقط او عدد معين من حقول قم بفحص إذا تم إرسال بيانات في كل حقل و قم بإستثنائه عند عمل عمليات حسابية على حقل بجمل شرطية على كل عملية إستقبال و عملية حسابية. او قم بعمل مثل سابق فورم لكل حقل و زر إرسال في نهاية كل سطر في جدول.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...