Django的文档并没有详细解释如何使用MultiValueField和MultiWidget。我试过解剖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)
任何人都知道这里发生了什么?我的猜测是发生了一些意外的异常抑制,但我无法找到源。
谢谢!
答案 0 :(得分:15)
请注意,django.forms.MultiValueField是form field而不是模型字段(如django.db.models.CharField)。因此,它不会被视为Test模型中的模型字段,也不会在数据库中创建。 (您可以使用./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)