2012-06-26 6 views
7

मैं विदेशी क्षेत्र के अन्य फ़ील्ड चयन के आधार पर फ़ील्ड डिफ़ॉल्ट मान सेट करने का प्रयास कर रहा हूं।Django अन्य क्षेत्रों के आधार पर गतिशील रूप से फील्ड मान सेट करें

class Product(models.Model): 
     description = models.CharField('Description', max_length=200) 
     price = models.FloatField('Price') 

class Sell(models.Model): 
     product = models.ForeignKey(Product) 
     price = models.FloatField('Price') 

प्रत्येक "उत्पाद" एक सामान्य मूल्य (या सुझाए गए मूल्य) है, इसलिए जब उपयोगकर्ता, व्यवस्थापक पृष्ठों में, एक नया बेचना और वह जोड़ना चाहते हैं/वह एक चुनें: असल में, इन कक्षाओं में हैं उत्पाद, मुझे उत्पाद मूल्य से विक्रय रूप से प्रतिलिपि बनाने की आवश्यकता है। सुझाए गए मूल्य को बेचने के लिए। मैं "सेव" विधि का उपयोग नहीं कर सकता क्योंकि उपयोगकर्ता उस पल में बदल सकता है।

क्या जावास्क्रिप्ट को स्पष्ट रूप से उपयोग करना आवश्यक है? या Django में ऐसा करने के लिए एक सुरुचिपूर्ण तरीका है?

उत्तर

3

आप इसे प्री-सेव हुक के साथ या बेचना मॉडल की सेव() विधि को ओवरराइड करके इसका सामना कर सकते हैं।

from django.db import models 

class Product(models.Model): 
    description = models.CharField('Description', max_length=200) 
    price = models.FloatField('Price') 

class Sell(models.Model): 
    product = models.ForeignKey(Product) 
    price = models.FloatField('Price') 

    # One way to do it: 
    from django.db.models.signals import post_save 
    def default_subject(sender, instance, using): 
     instance.price = instance.product.price 
    pre_save.connect(default_subject, sender=Sell) 

    # Another way to do it: 
    def save(self, *args, **kwargs): 
     self.price = self.product.price 
     super(Sell, self).save(*args, **kwargs) 
+1

और दूसरा तरीका मॉडल की 'स्वच्छ') विधि में 'मूल्य' फ़ील्ड को आरंभ करना है। 'सेव()' को ओवरराइड करना पसंद है, लेकिन 'सुपर()' को कॉल न करने के कारण क्लीनर है और यह सिर्फ इसके लिए डिज़ाइन किया गया एक फ्रेमवर्क हुक है :) –

1

आप गतिशील रूप से व्यवस्थापक वेबपेज में प्रपत्र फ़ील्ड मान अद्यतन करने के बारे में पूछ रहे हैं? जावास्क्रिप्ट में क्लाइंट-साइड फॉर्म व्यवहार की आवश्यकता है। Django का व्यवस्थापक विशेष रूप से इनलाइन जोड़ने/हटाने के लिए कुछ स्क्रिप्टिंग प्रदान करता है, लेकिन यह इस स्तर पर कार्यक्षमता प्रदान नहीं करता है।

Django का व्यवस्थापक पृष्ठ संदर्भ में jQuery को window.django.jQuery (या केवल django.jQuery) के अंतर्गत प्रदान करता है। Django फॉर्म हमेशा स्थिर फार्म फ़ील्ड आईडी आउटपुट। आउटपुट फॉर्म कोड की जांच करें और उत्पाद चयनकर्ता और संबंधित Sell.price इनपुट फ़ील्ड खोजें। फिर आप .change() या .on('change', ...) हैंडलर को उत्पाद चयनकर्ता को बेचने वाले फ़ील्ड पर मूल्य अपडेट करने वाले फ़ंक्शन के साथ कुछ करने के लिए jQuery का उपयोग कर सकते हैं।

भविष्य में संदर्भ के लिए, Django व्यवस्थापक लगभग ModelAdmin.prepopulated_fields लेकिन

prepopulated_fields के साथ अपने अनुरोध को पूरा DateTimeField, ForeignKey, और न ही ManyToManyField क्षेत्रों को स्वीकार नहीं करता।

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