2011-05-19 8 views
6

La documentación de Django no explica en detalle cómo usar MultiValueField y MultiWidget. Intenté diseccionar el one implementation y no he tenido buenos resultados. ¿Alguien me importaría darme un rápido apunte en la dirección correcta?Django: MultiValueField y MultiWidget

Mi ejemplo:

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) 

Y the resulting admin.

¿Alguien tiene una idea de lo que está pasando aquí? Creo que hay una supresión involuntaria de excepciones, pero no he podido localizar la fuente.

Gracias!

+0

MultiWidget howto: http://stackoverflow.com/questions/3511855/how-do- i-use-djangos-multiwidget/4663801 # 4663801 – Udi

Respuesta

15

Tenga en cuenta que es un django.forms.MultiValueField form field y no un campo demodelo (como django.db.models.CharField). Por lo tanto, no se trata como un campo de modelo en su modelo de prueba y no se creó en su base de datos. (Puede verificarlo con ./manage.py sqlall myapp).

Cambiar la models.py a:

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)  

dejar su mesa (en Linux/Mac: ./manage.py sqlclear myapp | ./manage.py dbshell) y syncdb para crear su mesa, esta vez con la columna b. Verifica tu administrador ahora.

Explicación: para crear un campo modelo personalizado, siga esto: https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

El juego el sistema campo de formulario la modelo de campo, se utilizó el método formfield.

(Por cierto, la forma "correcta" para diseñar el modelo de campo es probablemente un poco diferente, usando to_python y get_prep_value)