إعادة ترتيب الإدخالات في النموذج باستخدام السحب والإفلات

StackOverflow https://stackoverflow.com/questions/110774

  •  02-07-2019
  •  | 
  •  

سؤال

لنفترض أن لدي تطبيق تدوين في Django.كيف يمكنني إعادة ترتيب المشاركات باستخدام جدول قابل للسحب في المسؤول الافتراضي؟

سيكون من الأفضل ألا أضطر إلى إضافة أي حقول إضافية إلى النموذج، لكن إذا اضطررت لذلك، فيمكنني فعل ذلك.

هل كانت مفيدة؟

المحلول

للحصول على كود العمل للقيام بذلك، تحقق من ذلك المقطع 1053 في djangosnippets.org.

نصائح أخرى

ملاحظة على "سيكون من الأفضل ألا أضطر إلى إضافة أي حقول إضافية إلى النموذج، ولكن إذا كان علي فعل ذلك، فيمكنني ذلك."

عذرًا، ولكن يتم تحديد ترتيب المعلومات في قاعدة البيانات من خلال المعلومات نفسها:يجب عليك دائمًا إضافة عمود للطلب.ليس هناك حقا خيار حول ذلك.

علاوة على ذلك، لاسترداد الأشياء بهذا الترتيب، ستحتاج إلى الإضافة على وجه التحديد .order_by(x) لاستفساراتك أو إضافتها ordering إلى النموذج الخاص بك.

class InOrder( models.Model ):
    position = models.IntegerField()
    data = models.TextField()
    class Meta:
        ordering = [ 'position' ]

بدون الترتيب الميداني الإضافي لا يمكن أن يحدث.إنها إحدى قواعد قواعد البيانات العلائقية.

هناك حزمة رائعة لطلب الكائنات الإدارية هذه الأيام

https://github.com/iambrandontaylor/django-admin-sortable

أيضًا، بدلة جانغو لديه دعم مدمج لهذا

في فئة النموذج، ربما يتعين عليك إضافة حقل "الطلب" للحفاظ على ترتيب معين (على سبيل المثال.العنصر ذو الطلب = 10 هو العنصر الأخير والطلب = 1 هو الأول).ثم يمكنك إضافة رمز JS في قالب قائمة تغيير المسؤول (انظر هذا) للحفاظ على ميزة السحب والإفلات.أخيرًا قم بتغيير الترتيب في Meta النموذج إلى شيء مثل ['order'].

يمكنك تجربة هذا المقتطف https://Gist.github.com/barseghyanartur/1ebf927512b18dc2e5be (استنادًا في الأصل إلى هذا المقتطف http://djangosnippets.org/snippets/2160/).

التكامل بسيط جدا.

النموذج الخاص بك (فيmodels.py):

class MyModel(models.Model):
    name = models.CharField(max_length=255)
    order = models.IntegerField()
    # Other fields...

    class Meta:
        ordering = ('order',)

أنت المشرف (admin.py):

class MyModelAdmin(admin.ModelAdmin):
    fields = ('name', 'order',) # Add other fields here
    list_display = ('name', 'order',)
    list_editable = ('order',)

    class Media:
        js = (
            '//code.jquery.com/jquery-1.4.2.js',
            '//code.jquery.com/ui/1.8.6/jquery-ui.js',
            'path/to/sortable_list.js',
        )

قم بتغيير JS (للمقتطف) وفقًا لذلك إذا تمت تسمية سماتك المسؤولة عن الاحتفاظ بالاسم والترتيب بشكل مختلف في النموذج الخاص بك.

لا يمكن تحديد الترتيب إلا إذا قمت بإضافة حقل في النموذج الخاص بك. فلنقم بإضافة حقل موضع في النموذج الخاص بك.

In your models.py 

class MainModel(models.Model):

    name = models.CharField(max_length=255)
    position = models.PositiveSmallIntegerField(null=True)

    class Meta:
        ordering = ('position',)

In your apps admin.py

class IdeaCardTagInline(nested_admin.NestedStackedInline):
    model = MainModel
    extra = 0
    min_num = 1
    sortable_field_name = "position"

ordering = ('position',) في Meta سوف يقوم بترتيب MainModel وفقًا للقيمة الموجودة في حقل الموضع.sortable_field_name = "position" سيساعد في الملء التلقائي للقيمة في الموضع عندما يقوم المستخدم بسحب النماذج المتعددة وإسقاطها.

لرؤية نفس الترتيب في واجهة برمجة التطبيقات الخاصة بك، استخدم order_by(x) في view_model.py.مجرد مثال نموذجي:

Model.objects.filter().order_by('position').
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top