Django:MultiValueField和MultiWidget

loo*_*led 6 python django django-forms django-admin

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 ['', '']
Run Code Online (Sandbox Code Playgroud)

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 ''
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

admin.py

from django.contrib import admin
from models import Test
admin.site.register(Test)
Run Code Online (Sandbox Code Playgroud)

产生的管理.

任何人都知道这里发生了什么?我的猜测是发生了一些意外的异常抑制,但我无法找到源.

谢谢!

Udi*_*Udi 15

请注意,django.forms.MultiValueField是一个表单字段而不是模型字段(如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)      
Run Code Online (Sandbox Code Playgroud)

放下你的表(在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)