2009-09-07 13 views
10

मैं django और बिल्टिन व्यवस्थापक इंटरफेस के साथ प्रयोग कर रहा हूँ।django मॉडल/मॉडलफॉर्म - पसंद फ़ील्ड में गतिशील विकल्प कैसे प्राप्त करें?

मैं मूल रूप से एक ऐसा क्षेत्र बनाना चाहता हूं जो व्यवस्थापक UI में एक ड्रॉप डाउन हो। ड्रॉप डाउन विकल्प एक निर्दिष्ट निर्देशिका में उपलब्ध सभी निर्देशिका होनी चाहिए।
तो मैं इस तरह की एक क्षेत्र को परिभाषित:

test_folder_list = models.FilePathField(path=/some/file/path) 

यह मेरे सभी फ़ाइलें निर्देशिका में, लेकिन नहीं निर्देशिका को दर्शाता है।

क्या कोई जानता है कि मैं फ़ोल्डरों को कैसे प्रदर्शित कर सकता हूं?

भी मैं

test_folder_list = models.charField(max_length=100, choices=SOME_LIST) 

जहां SOME_LIST एक सूची मैं एक निर्देशिका में फ़ोल्डरों को पढ़ने के लिए कुछ कस्टम कोड का उपयोग कर पॉप्युलेट है कर की कोशिश की। यह काम करता है लेकिन यह रीफ्रेश नहीं करता है। यानी विकल्प सूची पहली बार ऐप चलाने के दौरान जो भी था वहां स्नैपशॉट तक ही सीमित है।

अग्रिम धन्यवाद।


अद्यतन:
कुछ सोच और अनुसंधान के बाद मैं क्या मैं करने के लिए या तो
1. मेरे अपने विजेट कि forms.ChoiceField
या
2 पर आधारित है बनाने के हो सकता है चाहता हूँ की खोज की। जब इसके लिए 1. मैं करने की कोशिश की ग्राहक

को प्रदान की गई है पसंद सूची में फ़ोल्डरों की सूची को पारित एक कस्टम विजेट। अपने मॉडल लगता है कि

class Test1(models.Model): 
    test_folder_ddl = models.CharField(max_length=100) 

तो यह मेरा कस्टम विजेट है:

class FolderListDropDown(forms.Select): 
def __init__(self, attrs=None, target_path): 
    target_folder = '/some/file/path' 
    dir_contents = os.listdir(target_folder) 
    directories = [] 
    for item in dir_contents: 
    if os.path.isdir(''.join((target_folder,item,))): 
    directories.append((item, item),) 
    folder_list = tuple(directories) 
    super(FolderListDropDown, self).__init__(attrs=attrs, choices=folder_list) 

तो मैं अपने modelForm

class test1Form(ModelForm): 
    test_folder_ddl = forms.CharField(widget=FolderListDropDown()) 

में ऐसा किया है और यह work.What नहीं लगता था मेरा मतलब है कि django मेरे विजेट का उपयोग नहीं करना चाहता था और इसके बजाय जब आप CharField का उपयोग करते हैं तो आपको डिफ़ॉल्ट टेक्स्टिनपुट प्रदान किया जाता है।

2. के लिए मैं अपने ModelForm में यह करने की कोशिश की

class test1Form(ModelForm): 
    test_folder_ddl = forms.CharField(widget=FolderListDropDown()) 
    test_folder_ddl.choices = {some list} 

मैं भी वर्ग test1Form (ModelForm) की कोशिश की: test_folder_ddl = forms.ChoiceField (विकल्प = {कुछ सूची})

और यह अभी भी डिफ़ॉल्ट चार फ़ील्ड विजेट प्रस्तुत करेगा। कोई भी जानता है कि मैं क्या गलत कर रहा हूं?

उत्तर

15

ये हल हो गया।पूरे दिन मेरा सिर मारने और लोगों द्वारा उदाहरणों के सभी प्रकारों के माध्यम से जाने के बाद मुझे यह काम करने के लिए मिला।

मूल रूप से मुझे # 2 के साथ सही विचार था। चरण
- हमारे मॉडल का मॉडलफॉर्म बनाएं - मॉडल के लिए डिफ़ॉल्ट फॉर्म फ़ील्ड उपयोगकर्ता को ओवरराइड करें। खरीफिल्ड। यानी हम स्पष्ट रूप से एक विकल्प फ़ील्ड का उपयोग करना चाहते हैं।
- तो हम ओवरराइड करने के लिए कैसे प्रपत्र instantiated है ताकि हम बात हम विकल्पों
के बारे में हमारी गतिशील सूची उत्पन्न करने के लिए उपयोग करना चाहते हैं फोन है - तो हमारे ModelAdmin में यह सुनिश्चित कर लें कि हम स्पष्ट रूप से हमारे ModelForm उपयोग करने के लिए व्यवस्थापक बता

Git देखें::

class Test1(models.Model): 
    test_folder_ddl = models.CharField(max_length=100) 


class Test1Form(ModelForm): 
    test_folder_ddl = forms.choiceField() 

    def __init__(self, *args, **kwargs): 
     super(Test1Form, self).__init__(*args, **kwargs) 
     self.fields['test_folder_ddl'].choices = utility.get_folder_list() 

class Test1Admin(admin.ModelAdmin): 
    form = Test1Form 
+0

बहुत बढ़िया, आप बहुत बहुत धन्यवाद, यह भी Django 1.10 पर काम करता है। – Moritz

2

मैं एक जनरेटर का उपयोग //gist.github.com/1118279.git

import pysvn 

    class SVNChoices(DynamicChoice): 
     """ 
     Generate a choice from somes files in a svn repo 
     """" 
     SVNPATH = 'http://xxxxx.com/svn/project/trunk/choices/' 
     def generate(self): 
      def get_login(realm, username, may_save): 
       return True, 'XXX', 'xxxxx', True 
      client = pysvn.Client() 
      client.callback_get_login = get_login 
      return [os.path.basename(sql[0].repos_path) for sql in client.list(self.SVNPATH)[1:]] 
संबंधित मुद्दे