2011-05-19 55 views
6

Django的文檔不能解釋如何使用MultiValueField和MultiWidget。我試過解剖one implementation,並沒有很好的結果。有人會介意給我一個正確方向的快速指示嗎?Django:MultiValueField和MultiWidget

我的例子:

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-我使用的,Django的-multiwidget/4663801#4663801 – Udi 2011-06-15 00:13:55

回答

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/MAC:./manage.py sqlclear myapp | ./manage.py dbshell)和執行syncdb創建表,這次列b。現在檢查您的管理員。

說明: 要創建自定義模型字段,按照此:https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

的集模式場的匹配形式場,使用了formfield方法。

(順便說一句, 「正確」 的方式來設計模型領域可能是一個有點不同,使用to_python和get_prep_value)