2017-11-13 21 views
5

मेरे पास दो मॉडल श्रेणी और उत्पाद हैं।कई मॉडल के लिए एक विजेट को एक मॉडल में अनुकूलित करना जिसमें एक परिपत्र विदेशीकी है

  • एक उत्पाद कई उत्पाद हो सकता है कई श्रेणियाँ
  • एक श्रेणी हो सकता है।
  • श्रेणियों में स्वयं के लिए एक गोलाकार विदेशी कुंजी है।
  • नहीं सभी श्रेणियाँ उसी गहराई स्तर है

उदाहरण:

  • श्रेणी ए
    • श्रेणी A_1
    • श्रेणी A_2
      • श्रेणी A_2_1
  • श्रेणी बी
  • श्रेणी सी
    • श्रेणी C_1

models.py

class Product: 
    categories = models.ManyToManyField(Category) 
    name = models.CharField(max_length=255) 

class Category: 
    categories = models.ForeignKey(self) 
    name = models.CharField(max_length=255) 

के रूप में पर्चा मैं एक ModelForm का उपयोग करें:

class ProductForm(ModelForm): 
    class Meta: 
     model = Product 
     fields = ['categories', 'name', 'short_description', 'description'] 
     widgets = { 
      'categories': MyWidget, 
     } 

मैं क्या हासिल करना चाहते हैं:

मैं एक सशर्त का चयन करें (संकीर्ण विकल्प) उत्पाद फार्म निर्माण पर लागू करना चाहते हैं:

  1. केवल शीर्ष अभिभावक श्रेणियां (स्तर 0 ए, बी, सी) उपलब्ध हैं
  2. उपयोगकर्ता अभिभावक श्रेणी का चयन करता है। अगर अभिभावक के पास बच्चों के साथ एक नया चयन बॉक्स दिखाई देता है (श्रेणी स्तर 1 ए 1, सी 1)
  3. उपयोगकर्ता स्तर 1 श्रेणी (ए 1, सी 1) का चयन करता है।एक नया बॉक्स का चयन करें, अपने बच्चों (स्तर 2 ए 2)

    • प्रक्रिया जब तक कोई संतान नहीं availavable (पुनरावर्ती) कर रहे हैं दोहराया है के साथ दिखाई माता-पिता बच्चों को है, तो एक उपयोगकर्ता ट्री में "छोटी से छोटी" श्रेणी का चयन करें
    • उपयोगकर्ता के लिए और अधिक श्रेणियां जोड़ने और 1-3 प्रक्रिया को फिर से शुरू करने के लिए एक नया बटन उपलब्ध है
    • मैं चुनना चाहता हूं, जावास्क्रिप्ट
    • का उपयोग करके नया चयन जोड़ें, फॉर्म सबमिट पर मैं केवल अंतिम बच्चों को भेजना चाहता हूं श्रेणियां

विकल्प मैंने सोचा:

  1. बदलें ManyToMany coresponding डिफ़ॉल्ट फील्ड्स - लग रहा है कि वहाँ कोई अच्छा हुक और/या विरासत
  2. हैं की तरह उपयोग ManytoMany की एक गैर-डिफ़ॉल्ट कस्टम फील्ड instean (Charfield की तरह) - स्वच्छ पर अधिक जटिल, फॉर्म
  3. विजेट को बदलें/दर्ज करें।

    1. : मेरी मुद्दों प्रस्तुत पर डिफ़ॉल्ट फील्ड को डेटा भेजने कैसे करने के लिए और प्राप्त/संपादन पर इसे दिखाने

    प्रैक्टिकल, मान लीजिए कि मैं 7 बॉक्स का चयन किया है, प्रत्येक के लिए मूल्यों के साथ जाने है Parent1-> Child11-> Child111

  4. Parent2-> Child21
  5. Parent3-> Child31-> Child311

मैं कैसे ब्राउज़र पर Django बता (अन्य डेटा के साथ) को भेजने के लिए प्रस्तुत कर सकता हूँ उनमें से तीनों में से कई अंतिम बच्चे

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

मुझे कोड और संकेत के रूप में कुछ मदद की ज़रूरत है कि यह कैसे करें।

enter image description here

+0

HTML टेम्पलेट कैसा दिखता है? क्या आपने कोई तर्क दिया है जैसे कि कथन? मुझे लगता है कि यह हो सकता है कि आपका समाधान कहां स्थित है .. – johnashu

+0

एचटीएमएल टेम्पलेट इससे कोई फर्क नहीं पड़ता, मुद्दा यह है कि मुझे माता-पिता और बच्चों और श्रेणी के गहराई के स्तर के संबंध में जो जानकारी चाहिए, उसे टेम्पलेट पर नहीं भेजा जाता है । मुझे ManyToMany द्वारा आवंटित डिफ़ॉल्ट फ़ील्ड को ओवरराइट करने की आवश्यकता है। मैं 'आंतरिक' फ़ील्ड मॉडल का चयन कर रहा हूं कई अलग-अलग – user3541631

उत्तर

2

Django आप मॉडल आप के बजाय मॉडल आयात करने के लिए हो रही है और इसे सीधे देने की एक '<app_name>.<model_name>' स्ट्रिंग के रूप में एक ForeignKey या ManyToManyField में संदर्भित कर रहे हैं परिभाषित करने के लिए अनुमति देता है। यह कई मुद्दों, विशेष रूप से परिपत्र आयात को हल करता है।


इस, मान लें कि आप एक Category मॉडल और products एक Product मॉडल के साथ साथ क्षुधा categories है:

products/models.py:

class Product: 
    categories = models.ManyToManyField(Category) 
    name = models.CharField(max_length=255) 

categories/models.py:

class Category: 
    categories = models.ManyToManyField(self) 
    name = models.CharField(max_length=255) 

सीधे आप क्या जरूरत के लिए अनुवाद कर सकते हैं:

products/models.py:

class Product: 
    categories = models.ManyToManyField('categories.Category') 
    name = models.CharField(max_length=255) 

categories/models.py:

class Category: 
    categories = models.ManyToManyField('self') 
    name = models.CharField(max_length=255) 
इस के साथ

, आप के रूप में कई श्रेणियों के रूप में आप चाहते हो सकता है:

category_one = Category.create(name='Category one') 
category_two = Category.create(name='Category two') 
category_three = Category.create(name='Category three') 
category_three.categories.add(category_one, category_two) 
some_product = Product.create(name='Test Product') 
some_product.categories.add(category_three) 

(ManyToManyField docs)


यह भी ध्यान रखना महत्वपूर्ण है कि किसी भी पायथन वर्ग के साथ, self कक्षा नहीं है - यह उदाहरण है। तो आप इसे किसी इंस्टेंस विधि के बाहर संदर्भित नहीं कर सकते हैं, here पर एक अच्छी व्याख्या है। 'self' स्ट्रिंग का एकमात्र कारण यहां काम करता है क्योंकि Django उस वर्ग में अनुवाद करता है, categories.Category - इसलिए यह 'self' को categories.Category के साथ स्पष्ट करने के लिए एक अच्छा विचार हो सकता है।

+0

मैं समझता हूं कि डीजेगो क्या कर रहा है, यह मुद्दा नहीं है, मुझे कई लोगों के लिए Django द्वारा चयनित डिफ़ॉल्ट 'आंतरिक' फ़ील्ड को ओवरराइट करना होगा और एक कस्टम विजेट भी बनाना होगा – user3541631

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