2011-02-03 7 views
8

उत्पन्न मैं अपने मॉडल के लिए एक यादृच्छिक स्लग उत्पन्न करने के लिए चाहते हैं, लेकिन स्थापना के बिना "खाली = सच" (के रूप में मैं सत्यापन के साथ बाद में इसे लागू करना चाहते हैं।)Django - डिफ़ॉल्ट स्लग

मैं अगर मैं कर सकता है सोच रहा था इस तरह कुछ:

slug = models.SlugField(unique=True, default=some_method(), verbose_name='URL Slug') 

जहां कुछ_method एक विधि है जो यादृच्छिक स्लग उत्पन्न करती है? मैं ऊपर कोड की कोशिश की है और यह काम नहीं करता :(

मैं क्या करना चाहते हैं क्या एक अनूठा स्लग (unique_slugify?)

+0

यह ऑब्जेक्ट बनने पर विधि को कॉल करता है, क्या इसका इरादा है? – jbcurtin

+0

हां, हालांकि यह काम नहीं करता है ... नाम त्रुटि: नाम 'some_method' परिभाषित नहीं किया गया है – Hanpan

उत्तर

8

आप मॉडल को बचाने-विधि रद्द कर सकते थे उत्पन्न है ताकि जब । कुछ एक नई कंपनी बनाई गई है, तो आप मक्खी पर स्लग उत्पन्न की तरह:

if not self.pk: 
    self.slug = ''.join(random.sample(string.ascii_lowercase, 10)) 

आप सकता है ऐसा करते हैं, लेकिन यह स्लग एक नियतात्मक slugified हो जाने के लिए किया जाएगा बहुत अच्छा और बेहतर नहीं है ऑब्जेक्ट्स का नाम।

+0

मुझे कोई फर्क नहीं पड़ता कि यह मामला है, मैं बस उलझन में हूं कि मैं इसे डिफ़ॉल्ट रूप में कैसे सेट करूं । मैं व्यवस्थापक पैनल – Hanpan

+0

का उपयोग नहीं कर रहा हूं, एक यादृच्छिक स्ट्रिंग विशिष्टता के लिए अच्छा नहीं है, पाचन की तरह कुछ चिपकने के लिए बेहतर (यादृच्छिक के साथ संयोजन में टाइमस्टैम्प) –

+0

धन्यवाद। मैं सहेजने की विधि को ओवरराइट नहीं करना चाहता था लेकिन ऐसा लगता है कि यह अपरिहार्य है। टॉमसो, अगर आपके पास इसका मतलब है कि इसका मतलब है तो मैं इसकी सराहना करता हूं। – Hanpan

1

शायद मॉडल सत्यापन मदद कर सकते हैं? http://docs.djangoproject.com/en/dev/ref/models/instances/

आप केवल उस मान को मान्य कर सकते हैं जो एक स्लग फ़ील्ड में लिखा जाना चाहिए और यदि यह पहले से मौजूद है, तो कुछ अद्वितीय उत्पन्न करें।

मॉडल बचाने के तरीके को ओवरराइड करना भी समाधान हो सकता है।

चीयर्स।

0

गूगल में खोज, मैं इसी तरह के सवाल पाया: How to use slug in django

मुझे लगता है कि इतना बेहतर दृष्टिकोण विधि बचाने के लिए, और के रूप में क्षेत्र validade पुनर्लेखन है।

लेकिन, स्लग अद्वितीय होना चाहिए, इसलिए यादृच्छिक स्ट्रिंग उत्पन्न करना अच्छा नहीं है! टॉमसो बार्डुगी की तरह जल्दी कहते हैं, अगर आप यूआरएल में टाइमस्टैम्प जोड़ते हैं, तो यह हल हो जाता है।

19

आप इसका उपयोग तब कर सकते हैं जब आप अपने स्लग को उसी मॉडल में किसी अन्य क्षेत्र में किए गए प्रविष्टि के साथ स्वचालित रूप से जेनरेट करना चाहते हैं, जहां स्लग झूठ बोलता है।

from django_extensions.db.fields import AutoSlugField 

slug = AutoSlugField(_('slug'), max_length=50, unique=True, populate_from=('name',)) 
  • populate_from मॉडल में क्षेत्र है जो ऑटो स्लग
+4

उन लोगों के लिए जो नहीं जानते हैं, ऐसा लगता है कि django_extensions मॉड्यूल एक ही नाम की लाइब्रेरी से है: http://packages.python.org/django-extensions/# – MrOodles

2

default एक मूल्य या एक प्रतिदेय हो गया है उत्पन्न होगा है।
तो यह default=some_method है, default=some_method() नहीं। यहां एक उदाहरण दिया गया है:

from django.contrib.auth.models import UserManager 

def randomString(): 
    um = UserManager() 
    return(um.make_random_password(length=25)) 

class Foo(models.Model): 
    code = models.CharField(max_length=25, default=randomString) 
+0

दिलचस्प, 'random.random' का उपयोग करके दिलचस्प नहीं था काम मुझे 'फ़ंक्शन को क्रमबद्ध नहीं कर सकता' त्रुटि मिली, लेकिन इस कस्टम फ़ंक्शन ने किया। – Flimm

संबंधित मुद्दे