2008-12-16 6 views
7

कहें कि मैं एक प्रोजेक्ट बनाना चाहता हूं, और टू-डू आइटम के साथ-साथ कई लोगों को मनमाने ढंग से काम करना चाहता हूं?, या डैंजो ओआरएम, एक से कई लोगों को आदेश देने का पारंपरिक तरीका क्या है?

अतीत में, मैंने एक क्रमांकित ऑर्डर फ़ील्ड जोड़ा है, और जब कोई ऑर्डर बदलना चाहता है, तो उसे अपने नए ऑर्डर नंबरों के साथ सभी आइटम अपडेट करना होगा। यह शायद सबसे खराब दृष्टिकोण है, क्योंकि यह परमाणु & पर कई अपडेट की आवश्यकता नहीं है।

मुझे लगता है कि Django में एक बहु-मूल्यवान अल्पविरामित इंटेगरफ़िल्ल्ड है जिसमें ऑर्डर करने वाली कुंजी को प्रोजेक्ट टेबल के एक फ़ील्ड में आइटम को तालिका में आइटमों को संग्रहीत करके ऑर्डर किया जा सकता है।

मैंने एक डेवी दशमलव प्रणाली पर विचार किया है, जहां मैं आइटम 3 लेना चाहता था और इसे 1 और 2 के बीच रखना चाहता था, तो मैं इसका ऑर्डर नंबर 1.5 कर दूंगा।

कुछ कहता है मुझे लगता है कि मैं हालांकि याद कर रहा हूँ एक आसान विकल्प नहीं है ...

कैसे आप एक-से-अनेक संबंध के लिए आदेश देना होगा?

उत्तर

5

मुझे इस समस्या से नफरत है ... और मैं हर समय इसमें दौड़ता हूं।

मेरी सबसे हालिया Django साइट के लिए हमारे पास न्यूजलेटर था जिसमें एन लेख थे और, ज़ाहिर है, आदेश महत्वपूर्ण था। मैंने डिफ़ॉल्ट आदेश को आरोही Article.id के रूप में असाइन किया था, लेकिन अगर यह "सही" ऑर्डर के अलावा किसी अन्य चीज़ में आलेख दर्ज किया गया तो यह असफल रहा।

न्यूज़लेटर change_form.html पृष्ठ पर मैंने इंटरफ़ेस प्लगइन (http://interface.eyecon.ro/) का उपयोग करके jQuery जादू का थोड़ा सा जोड़ा। मैं संबंधित लेखों के शीर्षक दिखाता हूं और उपयोगकर्ता उन्हें पसंद के रूप में खींच सकते हैं। एक ऑन चेंज हैंडलर है जो Article_id के आलेख_ऑर्डर फ़ील्ड में पुन: प्रयास करता है।

का आनंद लें,
पीटर

एप्लिकेशन = सामग्री, मॉडल = न्यूज़लेटर, निम्नलिखित है टेम्पलेट्स/व्यवस्थापक/सामग्री में/newslettter/change_form.html

{% extends 'admin/change_form.html' %} 

{% block form_top %}{% endblock %} 
{% block extrahead %}{{ block.super }} 
<script type="text/javascript" src="/media/js/jquery.js"></script> 
<script type="text/javascript" src="/media/js/interface.js"></script> 
<script> 
$(document).ready(
    function() { 
     $('ol.articles').Sortable(
      { 
       accept :  'sortableitem', 
       helperclass : 'sorthelper', 
       activeclass : 'sortableactive', 
       hoverclass : 'sortablehover', 
       opacity:  0.8, 
       fx:    200, 
       axis:   'vertically', 
       opacity:  0.4, 
       revert:   true, 
       trim:   'art_', 
       onchange: 
        function(list){ 
         var arts = list[0].o[list[0].id]; 
         var vals = new Array(); 
         var a; 
         for (a in arts) { 
          vals[a] = arts[a].replace(/article./, ''); 
         } 
         $('#id_article_order').attr('value', vals.join(',')); 
        } 
      }); 
    } 
); 
</script> 
{% endblock %} 

{% block after_related_objects %} 
{% if original.articles %} 
<style> 
.sortableitem { 
    cursor:move; 
    width: 300px; 
    list-style-type: none; 
    } 
</style> 

<h4>Associated Articles</h4> 
<ol class="articles" id="article_list"> 
{% for art in original.articles %} 
    <li id="article.{{art.id}}" class="sortableitem">{{art.title}}</li> 

{% endfor %} 
</ol> 
{% endif %} 
{% endblock %} 
1

मैंने इस बार कई बार भाग लिया है कि मैं बीएल या यूआई में इन गतिशील रूप से प्रबंधन करने के लिए बस गया हूं, और उसके बाद उपयोगकर्ता खुश होने के बाद एक उद्देश्य-निर्मित कॉलम को ऑर्डर करना जारी रखता हूं। एसक्यूएल को केवल व्यवस्थित रूप से ऑर्डर करने के लिए डिज़ाइन नहीं किया गया है, और यह हमेशा झगड़ा करता है।

2

"एक गिने आदेश जोड़ा के लिए क्षेत्र "- अच्छा।

"अपने नए ऑर्डर नंबरों के साथ सभी आइटम अपडेट करें" - टालने योग्य।

अंतराल के साथ संख्याओं का उपयोग करें।

  • फ़्लोटिंग पॉइंट। इस तरह, कोई व्यक्ति 1 और 2 के बीच "1.1" डाल सकता है। मुझे लगता है कि यह अच्छी तरह से काम करता है, क्योंकि ज्यादातर लोग समझ सकते हैं कि अनुक्रमण कैसे काम करता है। और आपको इस बारे में ज्यादा चिंता करने की ज़रूरत नहीं है कि कितनी जगह छोड़नी है - प्रत्येक नंबर के बीच बहुत सारी जगह है।

  • प्रारंभिक लोड पर, 100 या 1000 या प्रत्येक के बीच स्थान वाले कुछ आइटमों को संख्या दें। इस मामले में, आपको अनुमान लगाना होगा कि रीडरिंग के लिए कितने अंक छोड़ना है।

  • एक अल्पविराम से अलग स्थिति। प्रारंभ में, वे सभी (1,0), (2,0), (3,0), आदि हैं, लेकिन जब आप चीजों को पुनर्व्यवस्थित करना चाहते हैं, तो आपको (2,1) और (2,2) पेश करना पड़ सकता है जो (2,0) के बाद जाते हैं लेकिन पहले (3.0)।

    यह जटिल दिखता है, लेकिन कुछ लोग इस तरह की जटिलता पसंद करते हैं। यह अनिवार्य रूप से फ़्लोटिंग-पॉइंट जैसा ही है, सिवाय इसके कि एकल संख्या को एक (पूर्ण-संख्या, निहित-अंश) टुपल द्वारा प्रतिस्थापित किया जाता है। और यह पदानुक्रमों को संभालने के लिए फैलता है।

+0

अच्छा। मुझे बेसिक में लाइन नंबरों की याद दिलाता है। :-) –

0

इस सवाल के लिए एक देर जवाब है, लेकिन मैं तो बस में झंकार और का कहना है कि बी पेड़, बात की इस तरह के लिए एक महान डेटा संरचना कर रहे हैं, खासकर यदि आपकी पहुँच पैटर्न की आवश्यकता नहीं है चाहता था आप पूरी सूची को एक बार में पुनर्प्राप्त करने के लिए।

http://en.wikipedia.org/wiki/B-tree

2

मैं दो परियोजनाओं मैं पिछले थोड़ी देर में पर काम किया है के साथ इस समस्या पड़ा है। मेरे उदाहरण समाधान के लिए मेरे पास एक "फॉर्म" है जिसमें कई "चर" हैं और फ़ॉर्म पर चर के क्रम को क्रमबद्ध करने की आवश्यकता है। तो मैं लागू कर दिया है निम्नलिखित:

models.py

class Form(models.Model): 
    FormName = models.CharField(verbose_name="Form Name:", max_length=40) 
    VariableOrder = models.CommaSeparatedIntegerField(default="[]", editable=False) 

    def __unicode__(self): 
     return "%s" % (self.FormName) 

class Variable(models.Model): 
    FormID = models.ForeignKey(Form, default=0, editable=False, related_name="Variable") 
    VarName = models.CharField(max_length=32, verbose_name="Name of variable in the database:") 

    def __unicode__(self): 
     return "%s" % self.VarName 

ऊपर से कुंजी VariableOrder CommaSeparatedIntegerField जहाँ हम फार्म पर चर के आदेश स्टोर करने के लिए जा रहे हैं, और हम करने जा रहे हैं इसे एक पायथन सूची के रूप में उपयोग करें, यही कारण है कि डिफ़ॉल्ट [] है।

टेम्पलेट के लिए मैं अपने वैरिएबल को प्रस्तुत करता हूं कि हम ड्रैग और ड्रॉप सॉर्ट करने योग्य हैं (सूची तत्व जो मैं वास्तव में उपयोग करता हूं, उनमें एक टन अधिक सीएसएस संबंधित स्टाइल और वेरिएबल के बारे में जानकारी है)।

<ul id="sortable"> 

{% for Variable in VarList %} 
    <li id="{{ Variable.id }}">{{ Variable }}</li> 
{% endfor %} 

</ul> 

अब हम सूची बदलने के लिए सूची खींचने और ड्रॉप करने जा रहे हैं। इसके लिए आपको सिर में Django साइट से AJAX CSRF टुकड़ा करने की जरूरत है काम करने के लिए

$(function() { 
    $("#sortable").sortable({ 
     placeholder: "ui-state-highlight", 
     update: function(event, ui){ 
      $.ajax({ 
      type:"POST", 
      url:"{% url builder.views.variableorder %}", 
      data: {Order: JSON.stringify($('#sortable').sortable('toArray')) }, 
      success: function(data){ 
      // Do stuff here - I don't do anything. 
      } 
      }); 
     } 
    }); 
    $("#sortable").disableSelection(); 
}); 

महत्वपूर्ण हिस्सा ऊपर है कि "अद्यतन" समारोह हर बार में से किसी की एक स्थिति परिवर्तन होता है कहता है चर, जो AJAX भेजता है। JSON स्ट्रिंग के साथ क्रमबद्ध करने के लिए toArray हमें निम्न चर के नीचे आईडी को नीचे भेजता है, जिसका उपयोग इस प्रकार दृश्य द्वारा किया जाता है। नोट: मैं सक्रिय फॉर्म ऑब्जेक्ट को सत्र चर के रूप में रखता हूं, लेकिन किसी अन्य मामले में आपको उस फ़ॉर्म ऑब्जेक्ट को कॉल करने की आवश्यकता होगी जिसे आप ऑर्डर बदलना चाहते थे।

def variableorder(request): 
    if request.is_ajax(): 
     Order = request.POST['Order'] 
     updateOrder = request.session['FormID'] 
     updateOrder.VariableOrder = newOrder 
     updateOrder.save() 
     request.session['FormID'] = Form.objects.get(id=updateOrder.id) 
     return HttpResponse("Order changed.") 
    else: 
     pass 

इस सब की महत्वपूर्ण यह है कि आप स्ट्रिंग का मूल्यांकन करके एक सूची के रूप में इस CommaSeparatedIntegerField का उपयोग कर सकते है।उदाहरण के लिए:

aForm = Form.objects.get(id=1) 
currentOrder = aForm.VariableOrder 
currentOrder = eval(currentOrder) 
# Variable ID that we want to delete = 3 
currentOrder.remove(3) 
aForm.VariableOrder = currentOrder 
aForm.save() 

चर प्रतिपादन आदेश में:

aForm = Form.objects.get(id=1) 
currentOrder = aForm.VariableOrder 
currentOrder = eval(currentOrder) 
VarList = [] 
for i in currentOrder: 
    VarList.append(Variable.objects.get(id=i)) 
एक चर निकाला जा रहा है

aForm = Form.objects.get(id=1) 
currentOrder = aForm.VariableOrder 
currentOrder = eval(currentOrder) 
newVar = Variable(stuff in here) 
newVar.save() 
currentOrder.append(newVar.id) 
aForm.VariableOrder = currentOrder 
aForm.save() 

:

एक चर जोड़ना

यह एक मोटा पहला मसौदा है जिसका मैं उपयोग करने जा रहा हूं, लेकिन यह मेरे लिए अच्छा काम कर रहा है। कक्षा में एक विधि होने के नाते पाइथन सूची का मूल्यांकन होना स्पष्ट पहला सुधार है। जैसे।

def getVarOrder(self): 
    return eval(self.VariableOrder) 

और फिर केवल सूची.getVarOrder() को कॉल करें जब सूची में हेरफेर करना चाहते हैं। किसी भी मामले में उम्मीद है कि यह मदद करता है।

जेडी

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

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