gpt4 book ai didi

python - Django:MultiValueField 和 MultiWidget

转载 作者:太空狗 更新时间:2023-10-29 22:08:26 29 4
gpt4 key购买 nike

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 ['', '']

字段.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 ''

模型.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 .

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

谢谢!

最佳答案

请注意 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 dbshel​​l)和 syncdb 以创建您的表,这次使用列 b。立即检查您的管理员。

解释:要创建自定义模型字段,请按照以下步骤操作:https://docs.djangoproject.com/en/dev/howto/custom-model-fields/

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

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

关于python - Django:MultiValueField 和 MultiWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064121/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com