Django Admin Model ArrayField Change Delimiter

时间:2017-07-16 21:49:29

标签: python django django-models django-admin django-postgresql

我的模型看起来像这样:

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

2 个答案:

答案 0 :(得分:5)

一些相关文件:

如果您在管理网站上使用内置表单,或使用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

答案 1 :(得分:0)

稍微干净一点的解决方案(不覆盖Form类中的private void showChooseBottomSheet() { if (getActivity() == null) { return; } ChooseBottomSheetDialogFragment dialog = ChooseBottomSheetDialogFragment.newInstance(); dialog.show(getFragmentManager(), "some random string"); } )将只是在表单上指定字段。

__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()) 或为该字段指定其他小部件。