Django管理员模型ArrayField更改分隔符

5

我的模型长这样:

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类,但它不允许任何分隔符。


我不确定这是否算是重复,但它可能会指引你朝着正确的方向:https://dev59.com/dl0Z5IYBdhLWcg3wdQIy - Paulo Almeida
那个问题是我的一个超集。 - QuestionEverything
2个回答

9

一些相关的文档:

如果您正在使用管理站点上的内置表单,或者使用了没有自定义任何字段的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

4
稍微更为简洁的解决方案(不需要在表单类中重写__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,或为该字段指定不同的小部件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接