0

私は以下を含む非常に単純なモデルを持っていますJSONField:

class Thing(models.Model):
    title = models.CharField(max_length=1024)
    text = JSONField(default=dict)

キーと値のペアを入力できるカスタム ウィジェットを作成しました。

class JsonWidget(forms.widgets.Widget):
    template_name = 'json_widget.html'

    def get_context(self, name, value, attrs):
        context = super().get_context(name, value, attrs)
        data = json.loads(value)
        if not data:
            data = JSON_DEFAULT
        context['data'] = data.items()
        return context

    def value_from_datadict(self, data, files, name):
        keys = data.getlist('json-key')
        values = data.getlist('json-value')
        json_data = {k: v for k, v in zip(keys, values)}
        return json_data

フォームのフィールドの関数で、ウィジェットからdict返された を文字列に変換します。clean

class ThingForm(forms.ModelForm):

    class Meta:
        model = Thing
        fields = ['title', 'text']
        widgets = {
            'text': JsonWidget(),
        }

    def clean_text(self):
        text = self.cleaned_data.get('text')
        return json.dumps(text)

JsonWidget.value_from_datadict( dict) とThingForm.clean_text( )の出力を調べたところstr、予想されるタイプです。ただし、オブジェクトが保存されると、例外がスローされます。

TypeError: the JSON object must be str, bytes or bytearray, not 'dict'

Django 1.11 用のカスタム ウィジェットを作成するのはこれが初めてです。

ありがとう!

4

1 に答える 1