gpt4 book ai didi

django - Django admin 中的伪形式,在保存时生成 json 对象

转载 作者:行者123 更新时间:2023-12-03 21:28:30 25 4
gpt4 key购买 nike

我有一个带有 json 对象字段的模型。该对象在站点上用于控制一些 css 变量等。

现在在管理员中,我有一个文本字段,用户可以在其中保存 json 对象。我想显示一个包含所有属性的表单,这些属性在保存时将生成一个 json 对象。

基本上,用户看到并存储数据,如下所示:

{
"name":"hookedonwinter",
"user-id":123,
"basics":{
"height":150,
"weight":150
}
}

我宁愿让用户看到这个:
Name: <input field>
User Id: <input field>
Height: <input field>
Weight: <input field>

并且数据仍然存储在json中。

任何指导将不胜感激。链接到解释这一点的文档,加倍赞赏。

谢谢!

最佳答案

想法

基本上你需要做的是将你的 JSON 渲染到字段中。

  • 为您的模型创建存储 JSON 数据的字段。
  • 创建表单域
  • 创建小部件:
  • 将字段呈现为多个输入
  • 从 POST/GET 获取数据并将其转换回 JSON

  • 您还可以通过覆盖 TextField 的小部件来跳过步骤 1、2。

    文档链接
  • 小工具:https://docs.djangoproject.com/en/1.3/ref/forms/widgets/
  • 引用如何创建小部件的 Django 代码:https://code.djangoproject.com/browser/django/trunk/django/forms/widgets.py

  • 概念证明

    我尝试编写这个解决方案,这里是没有一些边缘情况对我有用的解决方案。

    字段.py
    import json

    from django.db import models
    from django import forms
    from django import utils
    from django.utils.translation import ugettext_lazy as _


    class JSONEditableField(models.Field):
    description = _("JSON")

    def formfield(self, **kwargs):
    defaults = {'form_class': JSONEditableFormField}
    defaults.update(kwargs)
    return super(JSONEditableField, self).formfield(**defaults)

    class JSONEditableWidget(forms.Widget):
    def as_field(self, name, key, value):
    """ Render key, value as field """
    attrs = self.build_attrs(name="%s__%s" % (name, key))
    attrs['value'] = utils.encoding.force_unicode(value)
    return u'%s: <input%s />' % (key, forms.util.flatatt(attrs))

    def to_fields(self, name, json_obj):
    """Get list of rendered fields for json object"""
    inputs = []
    for key, value in json_obj.items():
    if type(value) in (str, unicode, int):
    inputs.append(self.as_field(name, key, value))
    elif type(value) in (dict,):
    inputs.extend(self.to_fields("%s__%s" % (name, key), value))

    return inputs

    def value_from_datadict(self, data, files, name):
    """
    Take values from POST or GET and convert back to JSON..
    Basically what this does is it takes all data variables
    that starts with fieldname__ and converts
    fieldname__key__key = value into json[key][key] = value
    TODO: cleaner syntax?
    TODO: integer values don't need to be stored as string
    """
    json_obj = {}

    separator = "__"

    for key, value in data.items():
    if key.startswith(name+separator):
    dict_key = key[len(name+separator):].split(separator)

    prev_dict = json_obj
    for k in dict_key[:-1]:
    if prev_dict.has_key(k):
    prev_dict = prev_dict[k]
    else:
    prev_dict[k] = {}
    prev_dict = prev_dict[k]

    prev_dict[dict_key[-1:][0]] = value

    return json.dumps(prev_dict)


    def render(self, name, value, attrs=None):
    # TODO: handle empty value (render text field?)

    if value is None or value == '':
    value = '{}'

    json_obj = json.loads(value)
    inputs = self.to_fields(name, json_obj)

    # render json as well
    inputs.append(value)

    return utils.safestring.mark_safe(u"<br />".join(inputs))

    class JSONEditableFormField(forms.Field):
    widget = JSONEditableWidget

    模型.py
    from django.db import models
    from .fields import JSONEditableField

    class Foo(models.Model):
    text = models.TextField()
    json = JSONEditableField()

    希望这会有所帮助,这是它的外观:
    Result

    关于django - Django admin 中的伪形式,在保存时生成 json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9541924/

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