سؤال

class Foo(models.Model):
    title = models.CharField(max_length=20)
    slug = models.SlugField()

هل هناك طريقة مضمنة لجعل حقل سبيكة يتم ملؤه تلقائيًا بناءً على العنوان؟ربما في المشرف وخارج المشرف.

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

المحلول

بالنسبة للمشرف في Django 1.0 والإصدارات الأحدث، ستحتاج إلى استخدام

prepopulated_fields = {'slug': ('title',), }

في admin.py الخاص بك

المفتاح الخاص بك في قاموس prepopulated_fields هو الحقل الذي تريد ملؤه، والقيمة عبارة عن مجموعة من الحقول التي تريد ربطها.

خارج المشرف، يمكنك استخدام slugify وظيفة في وجهات نظركم.في القوالب، يمكنك استخدام |slugify منقي.

هناك أيضًا هذه الحزمة التي ستتولى هذا الأمر تلقائيًا: https://pypi.python.org/pypi/django-autoslug

نصائح أخرى

خارج المشرف، انظر مقتطف جانغو هذا.ضعه في الخاص بك .save(), ، وسيعمل مع الكائنات التي تم إنشاؤها برمجيًا.داخل المشرف، كما قال الآخرون، استخدم prepopulated_fields.

لمرحلة ما قبل 1.0:

slug = models.SlugField(prepopulate_from=('title',))

يجب أن تعمل على ما يرام

لـ 1.0، استخدم كامفلان

يمكنك أيضًا استخدام إشارة django pre_save لملء الارتباط الثابت خارج رمز مسؤول Django.يرى وثائق إشارات جانغو.

سيكون التحقق من صحة تفرد Ajax Slug مفيدًا أيضًا، انظر التحقق من صحة تفرد البزاقة من النوع الذي تستخدمه @ الوفرة غير العقلانية

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

اعتقدت أنني سأضيف إجابة كاملة وحديثة مع ذكر مسكتك:

1.تعبئة النماذج تلقائيًا في Django Admin

إذا كنت مهتمًا فقط بإضافة البيانات وتحديثها في المسؤول، فيمكنك ببساطة استخدام الحقول المعبأة مسبقًا يصف

class ArticleAdmin(admin.ModelAdmin):
    prepopulated_fields = {"slug": ("title",)}

admin.site.register(Article, ArticleAdmin)

2.تعبئة النماذج المخصصة تلقائيًا في القوالب

إذا قمت بإنشاء الواجهة التي يعرضها الخادم الخاصة بك باستخدام النماذج، فيمكنك ملء الحقول تلقائيًا باستخدام إما |slugify مرشح القالب أو slugify الأداة المساعدة عند حفظ النموذج (is_valid).

3.ملء حقول السلوغ تلقائيًا على مستوى النموذج باستخدام Django-autoslug

لن تقوم الحلول المذكورة أعلاه إلا بملء الحقل الثابت تلقائيًا (أو أي حقل) عند معالجة البيانات من خلال تلك الواجهات (المسؤول أو النموذج المخصص).إذا كان لديك واجهة برمجة التطبيقات (API) أو أوامر الإدارة أو أي شيء آخر يتعامل أيضًا مع البيانات التي تحتاجها لإسقاطها إلى مستوى النموذج.

django-autoslug يوفر حقول AutoSlugField التي تعمل على توسيع SlugField وتسمح لك بتعيين الحقل الذي يجب أن يتم ربطه بدقة:

class Article(Model):
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

يستخدم الحقل إشارات pre_save وpost_save لتحقيق وظائفه، لذا يرجى الاطلاع على نص مسكتك في أسفل هذه الإجابة.

4.تعبئة الحقول الثابتة تلقائيًا على مستوى النموذج عن طريق تجاوز save()

الخيار الأخير هو تنفيذ ذلك بنفسك، والذي يتضمن تجاوز طريقة save() الافتراضية:

    class Article(Model):
        title = CharField(max_length=200)
        slug = SlugField()

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Job, self).save(*args, **kwargs)

ملحوظة:ستتجاوز التحديثات المجمعة التعليمات البرمجية الخاصة بك (بما في ذلك الإشارات)

هذا سوء فهم شائع من قبل المبتدئين في Django.أولاً، يجب أن تعلم أن إشارات pre_save وpost_save ترتبط ارتباطًا مباشرًا بطريقة save().ثانيًا، تتحايل الطرق المختلفة لإجراء التحديثات المجمعة في Django على طريقة save() لتحقيق أداء عالٍ، من خلال التشغيل مباشرة على طبقة SQL.وهذا يعني أنه بالنسبة للنموذج النموذجي المستخدم في الحل 3 أو 4 أعلاه:

  • Article.objects.all().update(title='منشور جديد') سوف لا قم بتحديث سبيكة أي مقالة
  • استخدام ضخم_إنشاء أو تحديث بالجملة على نموذج المادة سوف لا قم بتحديث سبيكة أي مقالة.
  • نظرًا لعدم استدعاء طريقة الحفظ () ، لن يتم إصدار أي إشارات pre_save أو post_save.

لإجراء تحديثات مجمعة مع الاستمرار في استخدام القيود على مستوى التعليمات البرمجية، فإن الحل الوحيد هو تكرار الكائنات واحدًا تلو الآخر واستدعاء طريقة save() الخاصة بها، والتي تتميز بأداء أقل بشكل كبير من العمليات المجمعة على مستوى SQL.يمكنك بالطبع استخدام المشغلات في قاعدة البيانات الخاصة بك، على الرغم من أن هذا موضوع مختلف تمامًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top