2011-05-19 11 views
6

डीजेगो का दस्तावेज मल्टीवैल्यूफ़ील्ड और मल्टीविजेट का उपयोग करने के तरीके को समझाने का एक बहुत ही अच्छा काम नहीं करता है। मैंने one implementation को विच्छेदन करने का प्रयास किया है और अच्छे नतीजे नहीं हैं। क्या कोई मुझे सही दिशा में एक त्वरित सूचक दे ​​रहा है?डीजेगो: मल्टीवैल्यूफ़ील्ड और मल्टीविजेट

मेरे उदाहरण:

widgets.py

from django import forms 

class TestMultiWidget(forms.MultiWidget): 

    def __init__(self, attrs=None): 
     widgets = (
      forms.TextInput(attrs=attrs), 
      forms.TextInput(attrs=attrs), 
     ) 
     super(TestMultiWidget, self).__init__(widgets, attrs) 

    def decompress(self, value): 
     if value: 
      return value.split(':::')[0:2] 
     return ['', ''] 

fields.py

from django import forms 
from widgets import TestMultiWidget 

class TestMultiField(forms.MultiValueField): 
    widget = TestMultiWidget 

    def __init__(self, *args, **kwargs): 
     fields = (
      forms.CharField(), 
      forms.CharField(), 
     ) 
     super(TestMultiField, self).__init__(fields, *args, **kwargs) 

    def compress(self, data_list): 
     if data_list: 
      return ':::'.join(data_list) 
     return '' 

models.py

from django.db import models 
from util.fields import TestMultiField 

class Test(models.Model): 
    a = models.CharField(max_length=128) 
    b = TestMultiField() 
    c = models.CharField(max_length=128) 

admin.py

from django.contrib import admin 
from models import Test 
admin.site.register(Test) 

और the resulting admin

किसी के पास कोई संकेत है कि यहां क्या हो रहा है? मेरा अनुमान है कि कुछ अनजान अपवाद दमन हो रहा है, लेकिन मैं स्रोत का पता लगाने में सक्षम नहीं हूं।

धन्यवाद!

+0

MultiWidget howto: http://stackoverflow.com/questions/3511855/how-do- मैं उपयोग-djangos-multiwidget/4663801 # 4663801 – Udi

उत्तर

15

कृपया ध्यान दें django.forms.MultiValueField एक form field और नहीं एक मॉडल क्षेत्र (django.db.models.CharField की तरह) है। इसलिए, इसे आपके टेस्ट मॉडल में मॉडल फ़ील्ड के रूप में नहीं माना जाता है, और यह आपके डेटाबेस में नहीं बनाया गया था। (आप इसे ./manage.py sqlall myapp के साथ देख सकते हैं)।

करने के लिए अपने models.py बदलें:

from django.db import models 
from fields import TestMultiField 

class TestMultiModelField(models.Field): 

    def formfield(self, **kwargs): 
     defaults = {'form_class': TestMultiField} 
     defaults.update(kwargs) 
     return super(TestMultiModelField, self).formfield(**defaults) 

    def get_internal_type(self): 
     return 'TextField'   

class Test(models.Model): 
    a = models.CharField(max_length=128) 
    b = TestMultiModelField() 
    c = models.CharField(max_length=128)  

अपनी मेज ड्रॉप (पर linux/मैक: ./manage.py sqlclear myapp | ./manage.py dbshell) और syncdb अपनी मेज, स्तंभ ख के साथ इस समय बनाने के लिए। अब अपने व्यवस्थापक की जांच करें।

स्पष्टीकरण: कस्टम मॉडल क्षेत्र बनाने के लिए, इस का पालन करें: https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

सेट मॉडल क्षेत्र के मिलान रूप क्षेत्र, formfield विधि का इस्तेमाल किया गया था।

(btw, "सही" जिस तरह से मॉडल क्षेत्र डिजाइन करने के लिए शायद थोड़ी अलग है, to_python और get_prep_value का प्रयोग करके)

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