【问题标题】:Django: MultiValueField and MultiWidgetDjango:MultiValueField 和 MultiWidget
【发布时间】:2011-08-29 04:17:05
【问题描述】:

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)

还有the resulting admin

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

谢谢!

【问题讨论】:

标签: python django django-admin django-forms


【解决方案1】:

请注意 django.forms.MultiValueField 是 form field 而不是 model 字段(如 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/

设置model字段匹配的form字段,使用formfield方法。

(顺便说一句,设计模型字段的“正确”方式可能有点不同,使用 to_python 和 get_prep_value)

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2011-07-07
    • 2020-02-02
    • 2011-02-09
    • 2012-04-19
    • 1970-01-01
    • 2011-06-07
    • 2011-03-31
    • 2019-10-09
    相关资源
    最近更新 更多