Django管理模型ArrayField更改分隔符

fslejnso  于 2023-06-25  发布在  Go
关注(0)|答案(2)|浏览(94)

我的模型看起来像这样:

from django.contrib.postgres.fields import ArrayField
class Trigger(models.Model):
    solutions = ArrayField(models.TextField(blank=True, null=True), blank=True, null=True, help_text='some helpful text')

这允许我在默认情况下输入由逗号分隔的解决方案列表。例如:我可以在这个文本字段中输入:

1. watch out for dust.,
2. keep away from furry animals.,

这将创建一个包含两个单独字符串项的列表。但是,如果解决方案文本本身包含逗号,例如:

1. cockroaches, polens and molds might be harmful.

这将创建两个单独的解决方案行,因为该句子中存在逗号。
我如何告诉django使用不同于逗号的分隔符,因为它几乎肯定是句子的一部分。我怎样才能使用像'这样的分隔符|我查看了arrayfield类的内部,但它不允许任何分隔符。

epfja78i

epfja78i1#

一些相关文件:

  • https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/fields/#arrayfield
  • https://docs.djangoproject.com/en/1.11/ref/contrib/postgres/forms/#simplearrayfield

如果您在管理站点上使用内置表单,或者使用ModelForm而不自定义任何字段,则该字段可能会自动使用SimpleArrayField表单字段。看起来您可以覆盖分隔符字符。文档说明了以下注意事项:
该字段不支持分隔符的转义,因此,如果分隔符是基础字段中的有效字符,请小心。分隔符不需要只有一个字符。
无论如何,你可以通过提供一个像这样的自定义表单来做到这一点...

# forms.py

from django import forms
from .models import Trigger

class TriggerForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['solutions'].delimiter = '|'  # Or whichever other character you want.

    class Meta:
        model = Trigger
        fields = '__all__'

如果这是用于管理站点...

# admin.py

from django.contrib import admin
from .forms import TriggerForm
from .models import Trigger

@admin.register(Trigger)
class TriggerAdmin(admin.ModelAdmin):
    form = TriggerForm
6yjfywim

6yjfywim2#

稍微干净一点的解决方案(不覆盖Form类中的__init__)是只在表单上指定字段。

from django.contrib.postgres.forms import SimpleArrayField
from django import forms
from django.forms.fields import CharField
from django.forms.widgets import Textarea

class TriggerForm(forms.ModelForm):
    solutions = SimpleArrayField(CharField(), delimiter='|', widget=Textarea())

这样,您可以轻松地选择使用,例如SplitArrayField或为字段指定不同的小部件。

相关问题