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

Zeina Almakdisi

الأعضاء
  • المساهمات

    168
  • تاريخ الانضمام

  • تاريخ آخر زيارة

أجوبة بواسطة Zeina Almakdisi

  1. مرحبا اقوم بانشاء صفحة شخصية لكل موظف باستخدام 
    Django Api لكن لدي مشكلة هو عند تعبئة بيانات الموظف لاتظهر في مربع اختيار user
     اسماء المستخدمين الذي تم انشاء حسابات لهم علما انني استخدم User الذي تم انشاؤه تلقائيا في دجانغو (الصورة للتوضيح)

    class Employee(models.Model):
        id = models.IntegerField(primary_key=True)
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        name = models.CharField(max_length=255)
        age = models.IntegerField()
        gender = models.CharField(max_length=255)
        image = models.CharField(max_length=255)
        departmentId = models.ForeignKey('Department', on_delete=models.CASCADE)  
        securityServer = models.ForeignKey('SecurityServer', on_delete=models.CASCADE)
    
    
    ////////////////////////////////
    from .serializer import UserSerializer,EmployeeSerializer
    from django.db import connections
    from rest_framework import serializers
    from rest_framework.response import Response
    
    class EmployeeAPIView(APIView):
        permission_classes = [permissions.IsAuthenticated]
    
        def get(self, request):
            user = self.request.useruser = self.request.user
            employees = Employee.objects.filter(user=user)
            # employees = Employee.objects.all()
            serializer = EmployeeSerializer(employees, many=True)
            return Response(serializer.data)
    
    
    //////////////////////////////////////
    
    from rest_framework import serializers
    
    class EmployeeSerializer(serializers.ModelSerializer):
        user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
    
        class Meta:
            model = Employee
            fields = '__all__'
    
    
    class EmployeeAPIView(APIView):
        permission_classes = [permissions.IsAuthenticated]
    
        def get(self, request):
            
            employees = Employee.objects.all()
            serializer = EmployeeSerializer(employees, many=True)
            return Response(serializer.data)

    1.jpg

  2. مرحبا 

    ضمن مشروع دجانغو احتاج الى تفعيل خدمة الدفع الالكتروني apple pay 

    اذا كنت املك IBAN هل احتاج الدخول للموقع الرسمي والتسجيل 

    او فقط استخدم رقم IBAN مباشرة؟ 

    واحتاج الى معلومات اكثر عن خطوات تفعيل ابل باي 

    • أعجبني 1
  3. بتاريخ 4 ساعة قال عمر قره محمد:

    نعم بالتأكيد يوجد مواقع تدعم هذه الفكرة وهنالك الكثير من المواقع تعميل على أكثر من سيرفر (سيرفر لقواعد البيانات وآخر للصور والملفات واحياناً يكون هنالك واحد للـ frontend وآخر للـ backend ..إلخ).

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

     

    شكرا

    هل يمكنك اقتراح بعض المواقع؟ 

    • أعجبني 1
  4. بتاريخ 11 ساعة قال Mustafa Suleiman:

    أنتِ تستخدمين مصفوفة NumPy لـ image_path، ومصفوفات NumPy ليس لديها خاصية split().

    لذلك، عليك تحويل image_path إلى سلسلة نصية قبل استخدامها في str.split() كالتالي:

    image_path = str(image_path)
    output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg"

    من أجل تحويل image_path إلى سلسلة نصية، ثم سيستخدمها str.split() لإنشاء سلسلة جديدة تتكون من اسم الملف بدون الامتداد.

    وسبب ظهور الخطأ الثاني هو أنّك تحاولين استخدام cv2.imwrite() لكتابة مصفوفة NumPy كصورة، في الوقت الذي تتوقع فيه cv2.imwrite() إشارة OpenCV UMat كصورة، عليك إجراء التعديل التالي:

    image = cv2.imread(image_path)
    cv2.imwrite(output_image_path, image)

    حتى يتم قراءة الصورة من image_path إلى إشارة OpenCV UMat ثم سيستخدم cv2.imwrite() تلك الإشارة لكتابة الصورة إلى ملف.

    شكرا لك 

    بعد تطبيق التعديلات ظهر الخطأ التالي

        cv2.imwrite(output_image_path, image)
    cv2.error: OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:787: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'

     

    علما أنه عند طباعة 

        print(image_path)     يظهر الخرج على شكل مصفوفات 

        image = cv2.imread(image_path)

        print(image)   يظهر الخرج none فقط

        cv2.imwrite(output_image_path, image)

  5. مرحبا...

    يظهر الخطأ التالي

      output_image_path = "object-detection-" +image_path.split('.')[0] + ".jpg"
    AttributeError: 'numpy.ndarray' object has no attribute 'split'

    في الجزء من الكود:

       output_image_path = "object-detection-" +image_path.split('.')[0] + ".jpg"
        cv2.imwrite(output_image_path, image)
        cv2.destroyAllWindows()   

    وعند تحويل image_path الى سلسلة نصية str(image_path)

    يظهر الخطأ التالي:

    cv2.error: OpenCV(4.8.0): -1 :   error: (-5:Bad argument) in function 'imwrite'
    > Overload resolution failed:
    >  - img is not a numpy array, neither a scalar

    >  - Expected Ptr<cv::UMat> for argument 'img'

    جربت العديد من الحلول ولم ينجح :( 

  6. بتاريخ 57 دقائق مضت قال Mustafa Suleiman:

    لتتمكنين من معالجة أكثر من صورة مدخلة وحفظها، عليك إجراء التغييرات التالية:

    1. في حلقة for image_path in args['images']:، عليك إنشاء كائن image جديد لكل مسار صورة.
    2. بعد استدعاء دالة video_detector()، قومي بحفظ الصورة الناتجة إلى ملف جديد باسم فريد باستخدام متغير image_path لإنشاء اسم فريد لكل صورة ناتجة.
    import cv2
    from pathlib import Path
    import pafy
    import argparse
    import numpy as np
    
    
    classesf="yolov3.txt"
    weights="yolov3.weights"
    config="yolov3.cfg"
    scale=0.00392
    classes=None
    
    with open(classesf,'r') as f:
        classes=[line.strip() for line in f.readlines()]
    COLORS =np.random.uniform(0,255,size=(len(classes),3))
    net=cv2.dnn.readNet(weights,config)
    
    
      ############################################التعديل هنا لادخال الصور
    ap = argparse.ArgumentParser()
    ap.add_argument('-i', '--images',nargs='+', default=["sam.jpg"], 
                    help = 'path to input image')
    ap.add_argument('-c', '--config', default="yolov3.cfg",
                    help = 'path to yolo config file')
    ap.add_argument('-w', '--weights', default="yolov3.weights",
                    help = 'path to yolo pre-trained weights')
    ap.add_argument('-cl', '--classes', default="yolov3.txt",
                    help = 'path to text file containing class names')
    
    
    args =vars(ap.parse_args())
    
    for image_path in args['images']:
        image = cv2.imread(image_path)
    
        # Call the video_detector() function
        video_detector(image)
    
        # Save the output image to a new file with a unique name
        output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg"
        cv2.imwrite(output_image_path, image)
    

    وما قمت به هو:

    • إنشاء حلقة for لمعالجة كل صورة مدخلة.
    • إنشاء كائن image جديد لكل صورة مدخلة.
    • استدعاء دالة video_detector() لمعالجة الصورة الحالية.
    • حفظ الصورة الناتجة إلى ملف جديد باسم فريد.

    لإنشاء اسم فريد للصورة الناتجة، قمت باستخدام متغير image_path لفصل اسم الصورة عن امتدادها ثم قمت بإضافة بادئة "object-detection-" إلى اسم الصورة الأساسي.

    والآن ما عليك سوى تمرير مسارات الصور المدخلة كوسائط إلى البرنامج، أي لمعالجة الصور sam.jpg و cat.jpg، ستقومين بتشغيل الأمر التالي:

    python object_detection.py -i sam.jpg cat.jpg

    وذلك من أجل إنشاء صورتين، object-detection-sam.jpg و object-detection-cat.jpg، والتي ستحتوي على الكائنات المكتشفة في كل صورة.

     شكرا لك قمت بتطبيق الخطوات 

    اصبح يظهر الخطأ التالي 

    image = cv2.imread(image_path)
    TypeError: Can't convert object to 'str' for 'filename'

    يشير الى :

    def video_detector(image_path):
        while True:
            image = cv2.imread(image_path)#################### هنااا
            Width = image.shape[1]
            Height = image.shape[0]

     

  7. مرحبا..

    اعمل على خوارزمية yolov3 لاكتشاف الاشياء 

    احاول تعديل الكود ليصبح قادر على معالجة أكثر من صورة مدخلة وحفظهم 

    وضعت تعليقات لتوضيح مكان الخطأ

    
    import cv2
    from pathlib import Path
    import pafy
    import argparse
    import numpy as np
    
    
    classesf="yolov3.txt"
    weights="yolov3.weights"
    config="yolov3.cfg"
    scale=0.00392
    classes=None
    
    with open(classesf,'r') as f:
        classes=[line.strip() for line in f.readlines()]
    COLORS =np.random.uniform(0,255,size=(len(classes),3))
    net=cv2.dnn.readNet(weights,config)
    
    
      ############################################التعديل هنا لادخال الصور
    ap = argparse.ArgumentParser()
    ap.add_argument('-i', '--images',nargs='+', default=["sam.jpg"], 
                    help = 'path to input image')
    ap.add_argument('-c', '--config', default="yolov3.cfg",
                    help = 'path to yolo config file')
    ap.add_argument('-w', '--weights', default="yolov3.weights",
                    help = 'path to yolo pre-trained weights')
    ap.add_argument('-cl', '--classes', default="yolov3.txt",
                    help = 'path to text file containing class names')
    
    
    args =vars(ap.parse_args())
    
    for image_path in args['images']:
        image = cv2.imread('Images/frame*.jpg')
    ####################################################################
    def get_output_layers(net):
        
        layer_names = net.getLayerNames()
        try:
            output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
        except:
            output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
    
        return output_layers
    
    
    def draw_prediction(img, class_id, confidence, x, y, x_plus_w, y_plus_h):
    
        label = str(classes[class_id])
    
        color = COLORS[class_id]
    
        cv2.rectangle(img, (x,y), (x_plus_w,y_plus_h), color, 2)
    
        cv2.putText(img, label, (x-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
    
    
    
    def video_detector(image_path):
        while True:
            image = cv2.imread(image_path)
            Width = image.shape[1]
            Height = image.shape[0]
            blob = cv2.dnn.blobFromImage(image, 0.00392, (416,416), (0,0,0), True, crop=False)
            net.setInput(blob)
            outs = net.forward(get_output_layers(net))
            class_ids = []
            confidences = []
            boxes = []
            conf_threshold = 0.5
            nms_threshold = 0.4
            scale = 0.00392
            classes = None
    
    
            for out in outs:
                for detection in out:
                    scores = detection[5:]
                    class_id = np.argmax(scores)
                    confidence = scores[class_id]
                    if confidence > 0.5:
                        center_x = int(detection[0] * Width)
                        center_y = int(detection[1] * Height)
                        w = int(detection[2] * Width)
                        h = int(detection[3] * Height)
                        x = center_x - w / 2
                        y = center_y - h / 2
                        class_ids.append(class_id)
                        confidences.append(float(confidence))
                        boxes.append([x, y, w, h])
                        # print(class_id)
                    
            indices = cv2.dnn.NMSBoxes(boxes, confidences, conf_threshold, nms_threshold)
    
            for i in indices:
                try:
                    box = boxes[i]
                except:
                    i = i[0]
                    box = boxes[i]
                
                x = box[0]
                y = box[1]
                w = box[2]
                h = box[3]
                draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x+w), round(y+h))
    
                
    
            cv2.imshow("object detection", image)
            cv2.waitKey()
            if cv2.waitKey(1) & 0xff ==ord('q'):
                break
            cv2.imwrite("object-detection.jpg", image)
            output_image_path = "object-detection-" + image_path.split('.')[0] + ".jpg"
            cv2.imwrite(output_image_path, image)
            cv2.destroyAllWindows()
    
    if __name__ == "__main__":
        video_detector(args['image'])#############image يظهر الخطأ هنا عند تمرير 

     

    • أعجبني 1
  8. مرحبا..

    قمت بانشاء متجرالكتروني هل يمكنني ربطه مع موقع الف ياء 

    بحيث  اي عميل يفتح حساب في المتجر يفتح عندي له حساب في برنامج المبيعات بموقع الف ياء 

    ارجو التنويه او طرح افكار للمساعدة

    • أعجبني 1
  9. لدي كود يقوم بمعالجة الصور المدخلة وتحديد ماهية الاشياء في الصورة 

    مااحتاجه هو معرفة كم شخص في الصورة لعمل احصائية

    خرج الكود (الصورة):

     

    ارجو المساعدة على اقتراح كيف يمكن معرفة العدد ؟؟

    photo.jpg

    لاستطيع تخزينه في قاعدة البيانات

    • أعجبني 1
  10. مرحبا..

    لدي خوارزمية yolo v3 الذي تقوم بتحديد ماهية الاشياء الموجودة في الصورة 

    لايوجد بها مشاكل لكن في كل مرة اريد تشغيل الكود يجب ادخال مسار الملفات التالة ضمن terminal :

    python yolo.py --image dog.jpg --config yolov3.cfg --weights yolov3.weights --classes yolov3.txt

    هل يمكنني تثبيتهم ضمن الكود؟؟؟؟

     

    import cv2
    import pafy
    import argparse
    import numpy as np
    
    image="dog.jpg"
    classesf="yolov3.txt"
    weights="yolov3.weights"
    config="yolov3.cfg"
    scale=0.00392
    classes=None
    
    
    with open(classesf,'r') as f:
        classes=[line.strip() for line in f.readlines()]
    COLORS =np.random.uniform(0,255,size=(len(classes),3))
    net=cv2.dnn.readNet(weights,config)
    
    
    ap = argparse.ArgumentParser()
    ap.add_argument('-i', '--image', required=True, 
                    help = 'path to input image')
    ap.add_argument('-c', '-c/--yolov3.cfg', required=True,
                    help = 'path to yolo config file')
    ap.add_argument('-w', '--weights', required=True,
                    help = 'path to yolo pre-trained weights')
    ap.add_argument('-cl', '--classes', required=True,
                    help = 'path to text file containing class names')
    args = ap.parse_args()
    
    
    def get_output_layers(net):
        
        layer_names = net.getLayerNames()
        try:
            output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]
        except:
            output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
    
        return output_layers
    
    
    def draw_prediction(img, class_id, confidence, x, y, x_plus_w, y_plus_h):
    
        label = str(classes[class_id])
    
        color = COLORS[class_id]
    
        cv2.rectangle(img, (x,y), (x_plus_w,y_plus_h), color, 2)
    
        cv2.putText(img, label, (x-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
    
    
    image = cv2.imread(args.image)
    def video_detector():
        while True:
            image = cv2.imread(args.image)
            Width = image.shape[1]
            Height = image.shape[0]
            blob = cv2.dnn.blobFromImage(image, 0.00392, (416,416), (0,0,0), True, crop=False)
            net.setInput(blob)
            outs = net.forward(get_output_layers(net))
            class_ids = []
            confidences = []
            boxes = []
            conf_threshold = 0.5
            nms_threshold = 0.4
            scale = 0.00392
            classes = None
    
    
            for out in outs:
                for detection in out:
                    scores = detection[5:]
                    class_id = np.argmax(scores)
                    confidence = scores[class_id]
                    if confidence > 0.5:
                        center_x = int(detection[0] * Width)
                        center_y = int(detection[1] * Height)
                        w = int(detection[2] * Width)
                        h = int(detection[3] * Height)
                        x = center_x - w / 2
                        y = center_y - h / 2
                        class_ids.append(class_id)
                        confidences.append(float(confidence))
                        boxes.append([x, y, w, h])
    
    
            indices = cv2.dnn.NMSBoxes(boxes, confidences, conf_threshold, nms_threshold)
    
            for i in indices:
                try:
                    box = boxes[i]
                except:
                    i = i[0]
                    box = boxes[i]
                
                x = box[0]
                y = box[1]
                w = box[2]
                h = box[3]
                draw_prediction(image, class_ids[i], confidences[i], round(x), round(y), round(x+w), round(y+h))
    
            cv2.imshow("object detection", image)
            cv2.waitKey()
            if cv2.waitKey(1) & 0xff ==ord('q'):
                break
            cv2.imwrite("object-detection.jpg", image)
            cv2.destroyAllWindows()
    
    
    conn = psycopg2.connect("dbname=Management_Center user=postgres password=123456")
    
    [postgresql]
    host=localhost
    database=Management_Center
    user=postgres
    password=123456
    
    if __name__ == "__main__":
        video_detector()

     

    • أعجبني 2
  11. مرحبا..

    لدي كود برمجي يستخرج صور من الفيديوهات يعمل دون مشاكل

    لكن مااحتاجه هو الحصول على صورة كل 30 ثانية بدلا من كل 1 ثانية

    # from video2images import Video2Images
    
    import cv2 
    
    vcap = cv2.VideoCapture()
    # set frame width and height
    vcap.set(cv2.CAP_PROP_FRAME_WIDTH, 480)
    vcap.set(cv2.CAP_PROP_FRAME_HEIGHT, 640)
    vcap.open(100)
    
    vs=cv2.VideoCapture('VideoDoor//aaa.mp4')###input
    
    prop=cv2.CAP_PROP_FRAME_COUNT
    total=int(vs.get(prop))
    print(" [INFO] {} total frame in video".format(total))
    
    ret, img=vs.read()  
    print(ret)
    
    count=0
    
    while ret:
        
        cv2.imwrite("Images//frame%d.jpg" %count , img) ###output foldir
        ret, img=vs.read()
        print('Read a new frame:',count,ret)
        count += 1

     

    • أعجبني 1
  12. مرحبا 

    لدي استفسار هل يمكنني بناء تطبيق يعمل على اجهزة الاندرويد باستخدام دجانغو و Angular 

    وهل يوجد نصائح افضل

    • أعجبني 1
  13. مرحبا..

    احاول تشغيل كود بلاحقة glb. ضمن مشروع Three.js"

    قمت بتضمين ملف home.glb ضمن المشروع 

    واضفت الكود التالي الى Script.js

      import * as THREE from 'three';
    import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'
    const loader = new GLTFLoader();
      const draco = new DRACOLoader();
      draco.setDecoderPath( '/examples/jsm/libs/draco/' );
      loader.setDRACOLoader( draco );
    
    
      // Load a glTF resource
      loader.load(
        // resource URL
        '/home.glb',
        gltf => {
          gltf.scene.scale.set(.1,.1,.1);
          this._scene.add(gltf.scene);
        },
        xhr => {
          let percent = xhr.loader / xhr.total*100;
          console.log('${percent}% of solar system model loaded.');
        },
        undefined
      );
        

     

    وضمن كود ل html:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <script src="/script.js" type="module"></script>
        <title>3D</title>
    </head>
    <body>
        <camera class="webgi"></camera>
       <div class="container"> 
         <model-viewer src="./home.glb" auto-rotate camera-controls alt="cube" ></model-viewer> 
       </div>
    </body>
    </html>

    لكن لم تظهر أي نتيحة في المتصفح ، علما انه لايوجد اي خطأ في السيرفر

    • أعجبني 1
  14. مرحبا احاول تثبيت parcel ضمن بيئة node.js باستخدام 

    npm install parcel -g

    يبدأ التحميل وبعدها يظهر 

    up to date, audited 180 packages in 8s

    74 packages are looking for funding
      run `npm fund` for details

    found 0 vulnerabilities

    وعندما اقوم بتشغيل السيرفر يظهر الخطأ التالي :

    'parcel' is not recognized as an internal or external command,
    operable program or batch file.

     

    • أعجبني 1
  15. بتاريخ 43 دقائق مضت قال Mustafa Suleiman:

     

    ويجب استبدال <payment_id> بمعرف الدفع الذي يتم عملية الدفع له.

     

    قمت باستبدالها على الشكل التالي:

      if Payment.objects.filter(id=payment.id, Delivery_Service=True).exists():

    وواجهت الخطأ التالي في المتصفح:

    علما ان استخدام payment صحيحة

    Annotation 2023-03-29 123258.jpg

  16. مرحبا

    احاول حساب المسافةبالكيلومتر بين بوستل كود الزبون والبائع في حالة اذا اراد خدمة التوصيل

    وضرب النتيجة بسعر التوصيل 

    class Delivary(models.Model):
        ....
        price=models.PositiveIntegerField( verbose_name=_("Price for 1KM:"),blank=True, null=True,)
    
    class Payment(models.Model):
         ....
         post_code = models.CharField(max_length=10, )
         Delivery_Service=models.BooleanField(_("Delivery_Service?"),default=False,null=True)
    
    class Order(models.Model):
         ....
         delivery_costs = models.CharField( default=0, max_length=50,  blank=True, null=True)
    

    قمت بمعالجته ضمن الفيو على الشكل التالي:

    def payment(request):
        if Payment.Delivery_Service == True:
                dist=GeoDistance("in")
                cal_distance=dist.query_postal_code(Payment.post_code,product_detail.product_vendor.post_code)
                Order.delivery_costs=cal_distance*Delivary.price
                # print(delivery_costs,"km")
                #  {{Profile.post_code}}
        
        else:
                Order.delivery_costs==0     

    العرض:

                   {%if order.delivery_costs%}
                                    <tr>
                                        <td class="image product-thumbnail"></td>
                                        <td>
                                            <h6 class="w-160 mb-5"><a  class="text-heading">Delivary Service</a></h6></span>
                                           
                                        </td>
                                       
                                        <td>
                                            <h4 class="text-brand">+{{request.session.currency}}{{order.delivery_costs|floatformat:"2"|currency:request.session.currency}}</h4>
                                        </td>
                                    </tr>
                                    {%endif%}

    لكن لم تظهر النتيجة ماالخطأ؟؟ 

    • أعجبني 1
  17. بتاريخ 12 دقائق مضت قال Kais Hasan:

    يمكنك جلب الحد الاصغري من self، أي يكون الكود الخاص بك كما يلي:

    class Product(models.Model):
    ....
        firscoun = models.PositiveIntegerField(  verbose_name=_("Minimum Countete:"),blank=True, null=True,)
    
    ##################
        def clean(self):
            errors={}
            if self.count < self.firscoun:
               errors['min_count']= f'The min count must be greater than {firscoun}.'
    
            if errors:
                raise ValidationError(errors)

    هل يمكنك تجربة أن تقومي بإضافة منتج من صفحة الأدمن بعد هذا التعديل؟ أعتقد أنه يجب استدعاء الطريقة clean بشكل يدوي قبل عمل save للمودل، يمكن القيام بذلك عن طريق كتابة الطريقة save للقيام بذلك قبل استدعاء العملية save الاصلية، أي كما يلي:

    def save(self, *args, **kwargs):
      self.clean()
      super(Product, self).save(*args, **kwargs)

    طبعاً نضع هذه الدالة في ال model الخاص بالمنتج، أي مع الدالة clean.

    طبعاً عندها في المكان الذي يتم فيه إنشاء منتج جديد يجب القيام بكتابة try..except لالتقاط الخطأ الذي نرميه في الدالة clean.

    عند تطبيق الحل يظهر خطأ 

    Product object has no attributes 'count'

    • أعجبني 1
  18. بتاريخ 24 دقائق مضت قال Kais Hasan:

    هل الإضافة كما قلت لك أيضاً لا تنجح؟ أي أن تقومي بالإضافة  ضمن ال model و ليس ضمن ال form.

    مرحبا استاذ قيس..

    لا لم تنجح قمت بتطبيقها على الشكل التالي:

    class Product(models.Model):
    ....
        firscoun = models.PositiveIntegerField(  verbose_name=_("Minimum Countete:"),blank=True, null=True,)
    
    ##################
        def clean(self):
            errors={}
            firscoun = products_lower_bound_map[self.id]
            if self.count < firscoun:
               errors['min_count']= f'The min count must be greater than {firscoun}.'
    
            if errors:
                raise ValidationError(errors)

     

    • أعجبني 1
  19. بتاريخ 13 ساعة قال Mustafa Suleiman:

    الإجابة التي تم ذكرها من قبل قيس مشكورًا، تحتوي على فكرة جيدة، وهي استخدام دالة clean() الموجودة في ال model الخاص بالمنتج للتحقق من أن الحد الأدنى المحدد للكمية التي يمكن طلبها لهذا المنتج قد تم الالتزام به.

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

    لذلك، يمكن استخدام مجموعة العناصر الإضافية (widgets) في Django، وتحويل الحقل المرتبط بالكمية إلى نوع IntegerField والتحقق من الحد الأدنى لهذا الحقل في العنصر الإضافي clean() الخاص به.

    فيما يلي مثال محدث للطريقة السابقة:

    from django import forms
    from django.db import models
    
    class Product(models.Model):
        product_number = models.PositiveIntegerField(unique=True)
        min_count = models.PositiveIntegerField()
    
    class ProductForm(forms.ModelForm):
        class Meta:
            model = Product
            fields = '__all__'
    
        count = forms.IntegerField(widget=forms.NumberInput(attrs={'min': '0'}))
    
        def clean_count(self):
            count = self.cleaned_data['count']
            min_count = Product.objects.get(product_number=self.cleaned_data['product_number']).min_count
            if count < min_count:
                raise forms.ValidationError(f'The minimum count for this product is {min_count}.')
            return count

    في المثال، يتم استخدام Django form بدلاً من استخدام clean() في ال model، ويتم إنشاء عنصر إضافي (count) لإدخال الكمية، وتحويل الحقل المرتبط بهذا العنصر الإضافي إلى IntegerField.

    ثم التحقق من الحد الأدنى للكمية في clean_count()، وعرض الخطأ على الحقل المرتبط بهذا العنصر الإضافي.

    شكرا لكم..

    قمت بإضافتها ضمن المودل بعدclass Product

    كالتالي:

    class ProductForm(forms.ModelForm):
        class Meta:
            model = Product
            fields = '__all__'
        count = forms.IntegerField(widget=forms.NumberInput(attrs={'min': '0'}))
    
        def clean_count(self):
            count = self.cleaned_data['count']
            firscoun = Product.objects.get(product_name=self.cleaned_data['product_name']).firscoun
            if count < firscoun:
                    raise forms.ValidationError(f'The minimum count for this product is {firscoun}.')
            return count

    لكن مازال بإمكانه اختيار الرقم الاصغر من المسموح له

    ماالمشكلة؟؟

    كذلك قمت بمحاولة استبدال product_name ب id 

    • أعجبني 1
×
×
  • أضف...