জ্যাঙ্গোতে আমি কীভাবে একটি স্লাগ তৈরি করব?


218

আমি SlugFieldজ্যাঙ্গোতে একটি তৈরি করার চেষ্টা করছি ।

আমি এই সাধারণ মডেলটি তৈরি করেছি:

from django.db import models

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

আমি তখন এটি করি:

>>> from mysite.books.models import Test
>>> t=Test(q="aa a a a", s="b b b b")
>>> t.s
'b b b b'
>>> t.save()
>>> t.s
'b b b b'

আমি আশা করেছিলাম b-b-b-b

উত্তর:


413

আপনার স্লগাইফাই ফাংশনটি ব্যবহার করতে হবে।

>>> from django.template.defaultfilters import slugify
>>> slugify("b b b b")
u'b-b-b-b'
>>>

পদ্ধতিটি slugifyওভাররাইড করে আপনি স্বয়ংক্রিয়ভাবে কল করতে পারেন save:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        self.s = slugify(self.q)
        super(Test, self).save(*args, **kwargs)

সচেতন যে উপরোক্ত যখন পরিবর্তনের আপনার URL কারণ হবে হউন q, ক্ষেত্র সম্পাদিত হয় যা ছিন্ন লিঙ্কগুলি সৃষ্টি করতে পারে । আপনি যখন কোনও নতুন অবজেক্ট তৈরি করবেন কেবল তখনই স্লগটি উত্পন্ন করা ভাল:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.id:
            # Newly created object, so set slug
            self.s = slugify(self.q)

        super(Test, self).save(*args, **kwargs)

4
লাজুক একটি বিশেষ মডেল টাইপ আছে? কেন কেবল চারফিল্ডগুলিকে স্লিগাইফাই করবেন না?
জন

23
স্লগফিল্ডস db_index = ডিফল্টরূপে সত্য সেট করে এবং ডিফল্টরূপে একটি ফর্ম ক্ষেত্রও ব্যবহার করে যা বৈধ স্লাগগুলি (যদি কোনও মডেলফোর্মে বা অ্যাডমিনে প্রতিনিধিত্ব করা হয়) প্রয়োজন হয় তার বৈধতা রেজেক্স রয়েছে। আপনি যদি চার্ফিল্ডের সাহায্যে ম্যানুয়ালি সেই জিনিসগুলি করতে পারেন তবে আপনি যদি এটি পছন্দ করেন তবে এটি আপনার কোডের উদ্দেশ্যটি আরও কম পরিষ্কার করে। এছাড়াও, আপনি যদি অ্যাডমিনে জেএস-ভিত্তিক অটো-প্রিপুলেট চান তবে প্রিপোপুলেট_ফিল্ডস মডেলএডমিন সেটিংসটি ভুলে যাবেন না।
কার্ল মেয়ার 14

4
ডিংল তার উত্তরে যেমনটি বলেছিল, তেমন কোনও লেখার সময় ত্রুটিগুলি ছুঁড়ে ফেলা থেকে রক্ষা পেতে আপনার def save(self):সাথে প্রতিস্থাপন করতে হবে ।def save(self, *args, **kwargs):test.objects.create(q="blah blah blah")
লিয়াম

6
সাবধান হন যে এই কোডটি প্রতিটি সংরক্ষণের স্লাগ আপডেট করবে। আপনার ইউআরএল পরিবর্তন হবে, এবং "শীতল ইউআরআইগুলি
dzen

18
slugify()এটিও পাওয়া যাবে, এটি django.utils.text.slugifyকখন যুক্ত হয়েছিল তা পরিষ্কার নয়।
mrmagooey

112

কিছু utf-8 টি অক্ষরের সাথে কর্নার কেস রয়েছে

উদাহরণ:

>>> from django.template.defaultfilters import slugify
>>> slugify(u"test ąęśćółń")
u'test-aescon' # there is no "l"

এটি ইউনিিডেকোড দিয়ে সমাধান করা যেতে পারে

>>> from unidecode import unidecode
>>> from django.template.defaultfilters import slugify
>>> slugify(unidecode(u"test ąęśćółń"))
u'test-aescoln'

7
ইউটিএফ -8 এখন স্লুগাইফাই দ্বারা সঠিকভাবে পরিচালনা করা হয়েছে (জাজানো 1.8.5 এ)
রিক ওয়েস্টেরা

@ রিকওয়েস্তেরা যেমন বলেছিলেন এটি এখন স্লগাইফাই দ্বারা পরিচালিত হয়েছে, যদিও কোনও কারণে যদি আপনি স্লগাইফাই ব্যবহার করতে না চান তবে django.utils.encoding থেকে iri_to_uri দেখুন: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এরওয়োল

64

থেপিরের উত্তরে একটি ছোট সংশোধন: save()মডেল ক্লাসগুলিতে ফাংশনকে ওভাররাইড করতে , এতে আরও যুক্তি যুক্ত করুন:

from django.utils.text import slugify

def save(self, *args, **kwargs):
    if not self.id:
        self.s = slugify(self.q)

    super(test, self).save(*args, **kwargs)

অন্যথায়, test.objects.create(q="blah blah blah")একটি force_insertত্রুটি (অপ্রত্যাশিত যুক্তি) এর ফলস্বরূপ ।


2
চিকিত্সকের উত্তরে আরও একটি ছোট্ট বিষয়: আমি এই শেষ লাইনটি তৈরি করব return super(test, self).save(*args, **kwargs)। আমি মনে করি এই পদ্ধতিটি ফিরে Noneআসবে, এবং আমি এটি পরিবর্তন করার কোনও পরিকল্পনা সম্পর্কে জানি না, তবে সুপারক্লাসের পদ্ধতিটি ভবিষ্যতে কোনও সময়ের পরিবর্তনের ক্ষেত্রে এটি কী করবে তা ফিরিয়ে আনার কোনও ক্ষতি হয় না।
ডানকান পার্কস

এই সমাধানের জন্য django.utils.text আমদানি স্লগাইফাই থেকে দয়া করে এটি যুক্ত করুন ।
রুথিনেটর

1
@ রথিনেটর এটি করেছে
জোনাস

এটি করার জন্য এটি এখনও পছন্দসই পদ্ধতি কিনা তা জানতে কিছু ফেইলারের কথা বলা।
sytech

29

আপনি যদি আপনার মডেলের নতুন আইটেমগুলি যুক্ত করতে প্রশাসক ইন্টারফেসটি ব্যবহার করেন তবে আপনি নিজের ModelAdminমধ্যে একটি সেট আপ করতে পারেন admin.pyএবং prepopulated_fieldsকোনও স্লাগের প্রবেশের স্বয়ংক্রিয়ভাবে ব্যবহার করতে পারেন:

class ClientAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ('name',)}

admin.site.register(Client, ClientAdmin)

এখানে, যখন ব্যবহারকারী অ্যাডমিন ফর্মের জন্য একটি মান প্রবেশ করে name , slugস্বয়ংক্রিয়ভাবে সঠিক স্লিগাইফাইডের সাথে পপুলেশন হবে name


আমার slugএবং nameক্ষেত্রগুলির অনুবাদ রয়েছে। অনুবাদ সহ আমি কীভাবে এটি করতে পারি? কারণ আমি যুক্ত করার চেষ্টা করেছি 'slug_en':('name_en',)এবং ত্রুটি পেয়েছি যে গুণটি আমার মডেলটিতে নেই।
প্যাট্রিসিয়া

22

বেশিরভাগ ক্ষেত্রে স্লাগ পরিবর্তন করা উচিত নয়, তাই আপনি সত্যিই কেবল প্রথম সংরক্ষণে এটি গণনা করতে চান:

class Test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(editable=False) # hide from admin

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(Test, self).save()

6

prepopulated_fieldsআপনার প্রশাসক শ্রেণিতে ব্যবহার করুন :

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

admin.site.register(Article, ArticleAdmin)

1
আপনি ব্যাখ্যা করতে পারেন? অ্যাডমিন কীভাবে প্রকল্পটিকে প্রভাবিত করে?
ব্রাইস

5

আপনি যদি স্লগফিল্ডটি সম্পাদনযোগ্য না হিসাবে সেট করতে চান না, তবে আমি বিশ্বাস করি আপনি নাল এবং ফাঁকা বৈশিষ্ট্যগুলি মিথ্যাতে সেট করতে চাইবেন। অন্যথায় আপনি অ্যাডমিনে সংরক্ষণ করার চেষ্টা করার সময় একটি ত্রুটি পাবেন।

সুতরাং উপরের উদাহরণে একটি পরিবর্তনটি হবে ::

class test(models.Model):
    q = models.CharField(max_length=30)
    s = models.SlugField(null=True, blank=True) # Allow blank submission in admin.

    def save(self):
        if not self.id:
            self.s = slugify(self.q)

        super(test, self).save()

দস্তাবেজগুলি সম্পাদনযোগ্য
স্টিফেন

4

আমি জাজানো 1.7 ব্যবহার করছি

আপনার মডেলটিতে এটির মতো একটি স্লাগফিল্ড তৈরি করুন:

slug = models.SlugField()

তারপরে admin.pyসংজ্ঞায়িত করা prepopulated_fields;

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

ঠিক কী আমি চেয়েছিলাম
নিক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.