2008-09-21 14 views
8

का उपयोग करके मॉडल में प्रविष्टियों को पुन: क्रमबद्ध करना कहें कि मेरे पास Django में ब्लॉगिंग ऐप है। डिफ़ॉल्ट व्यवस्थापक में ड्रैग करने योग्य तालिका का उपयोग करके मैं पोस्ट को फिर से ऑर्डर कैसे कर सकता हूं?ड्रैग-एंड-ड्रॉप

यह सबसे अच्छा होगा अगर मुझे मॉडल में कोई अतिरिक्त फ़ील्ड जोड़ने की ज़रूरत नहीं है, लेकिन अगर मुझे वास्तव में करना है।

+0

2011 में डीजेंगो 1.2/1.3 के लिए अब सबसे अच्छा समाधान क्या है? – monkut

उत्तर

1

मॉडल कक्षा में आपको विशिष्ट क्रम को बनाए रखने के लिए शायद "ऑर्डर" फ़ील्ड जोड़ना होगा (उदाहरण के लिए आइटम = 10 के साथ आइटम अंतिम है और ऑर्डर = 1 पहला है)। फिर आप खींचें & ड्रॉप सुविधा को बनाए रखने के लिए व्यवस्थापक change_list टेम्पलेट में एक जेएस कोड जोड़ सकते हैं (this देखें)। आखिरकार मॉडल के मेटा में ऑर्डर करना जैसे ['ऑर्डर']।

4

"यह सबसे अच्छा होगा अगर मुझे मॉडल में कोई अतिरिक्त फ़ील्ड जोड़ने की ज़रूरत नहीं है, लेकिन अगर मुझे वास्तव में करना है।"

क्षमा करें, लेकिन डेटाबेस में जानकारी का क्रम स्वयं जानकारी द्वारा निर्धारित किया जाता है: आपको हमेशा ऑर्डर करने के लिए कॉलम जोड़ना होगा। इसके बारे में वास्तव में कोई विकल्प नहीं है।

आगे, इस क्रम में चीजों को पुनर्प्राप्त करने के लिए, आपको अपने प्रश्नों में विशेष रूप से .order_by(x) जोड़ने या अपने मॉडल में ordering जोड़ने की आवश्यकता होगी।

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

अतिरिक्त फ़ील्ड ऑर्डरिंग के बिना नहीं हो सकता है। यह संबंधपरक डेटाबेस के नियमों में से एक है।

+0

धन्यवाद, लेखक के विपरीत मैं जोड़ने के लिए लाइन की तलाश में था! –

3

वहाँ व्यवस्थापक आदेश देने के लिए एक अच्छा पैकेज वस्तुओं इन दिनों

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

इसके अलावा, django-suit इस

+0

दुर्भाग्य से django-suit का कार्यान्वयन ड्रैग-एंड-ड्रॉप नहीं है। – Nexus

1

के लिए अंतर्निहित समर्थन आप इस स्निपेट 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', 
     ) 

बदलें (स्निपेट का) जे एस तदनुसार अगर अपनी विशेषताओं के आयोजन के लिए जिम्मेदार नाम और ऑर्डरिंग को आपके मॉडल में अलग-अलग नाम दिया गया है।

0

आदेश केवल तभी निर्धारित किया जा सकता है यदि आप अपने मॉडल में कोई फ़ील्ड जोड़ते हैं। चलो अपने मॉडल में स्थिति फ़ील्ड जोड़ें।

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',) स्थिति क्षेत्र के मान के अनुसार MainModel आदेश देगा। sortable_field_name = "position" उपयोगकर्ता द्वारा कई मॉडलों को खींचने और छोड़ने पर स्थिति के मूल्य को स्वत: भरने में मदद मिलेगी।

अपने एपीआई में एक ही ऑर्डर देखने के लिए, view_model.py में order_by (x) का उपयोग करें। बस एक आदर्श उदाहरण:

Model.objects.filter().order_by('position'). 

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

  • कोई संबंधित समस्या नहीं^_^