【问题标题】:Django-Forms with json fields带有 json 字段的 Django-Forms
【发布时间】:2013-01-15 14:36:28
【问题描述】:

我希望在表单字段中接受 json 数据,然后使用一些数据库操作对其进行验证。数据将主要由整数数组组成。所以你能帮我看看我该怎么做。

我试图用谷歌搜索,但没有得到任何体面的答案。请帮忙。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您需要使用CharField 将其作为文本输入。在该字段的 clean 方法中,您可以根据您的要求进行验证,以检查输入是否有效。

    类似:

    class myForm(forms.Form):
         jsonfield = forms.CharField(max_length=1024)
    
        def clean_jsonfield(self):
             jdata = self.cleaned_data['jsonfield']
             try:
                 json_data = json.loads(jdata) #loads string as json
                 #validate json_data
             except:
                 raise forms.ValidationError("Invalid data in jsonfield")
             #if json data not valid:
                #raise forms.ValidationError("Invalid data in jsonfield")
             return jdata
    

    您还可以找到用于 JSON 数据输入的自定义字段。

    【讨论】:

    • 您认为为 json 数据创建自定义字段会是更好的选择吗?我也想过,但无法决定这是否是最佳选择?
    • @SaranshMohapatra,如果您这是主要功能之一,我们会很好地自定义字段。如果这是其中之一,那么它可能有点太多了。此外,不要编写新的,而是寻找任何现有的实现。
    • @Rohan 我在 PyCharm 中得到红色锯齿线,要求我导入模块。
    • @Sarit for python 2.6+ 使用import json
    • json_data 的目的是什么,那么如果我们返回 jdata 呢?
    【解决方案2】:

    您可以使用 that decision 使用 JSON 数据中的字段制作表单

    例子:

    forms.py

    # -*- coding: utf-8 -*-
    from django import forms
    from splitjson.widgets import SplitJSONWidget
    
    
    class testForm(forms.Form):
        attrs = {'class': 'special', 'size': '40'}
        data = forms.CharField(widget=SplitJSONWidget(attrs=attrs, debug=True))
    

    views.py

    # -*- coding: utf-8 -*-
    from django.shortcuts import render_to_response
    from django.template import RequestContext
    from forms import testForm
    
    
    def test_dict(request):
        json = {'a': 1,
                'b': 2,
                'c': 3,
                'd': 4}
        form = testForm(request.POST or None, initial={'data': json})
        if form.is_valid():
            # validate and save
            pass
    
        template = 'test_template.html'
        context = RequestContext(request, {'form': form})
        return render_to_response(template, context)
    

    template.py

    <!doctype html>
    <html>
        <head></head>
        <body>
            Errors: 
            {% for field, error in form.errors.items %}
                <ul>
                <li>{{ error }}</li>
                </ul>
            {% empty %}
                no errors 
            {% endfor %}
            <hr/>
            List of:
                <form action="" method="post">
                    {% csrf_token %}
                    {{ form.as_p}}
                    <input type="submit" value="Submit" />
                </form>
        </body>
    </html>
    

    结果:

    【讨论】:

      【解决方案3】:

      检查django-json-field,它实现了 JSONField 和关联的表单字段。

      【讨论】:

        【解决方案4】:

        如果您的 Django 模型包含一个名为 scope 的 JSON 字段,或者是 django.contrib.postgres.forms.jsonb.JSONFieldjsonfield.fields.JSONField,那么只需将您的 Django ModelForm 重写为:

        from django.form import fields
        from entangled.forms import EntangledModelForm
        
        class MyForm(EntangledModelForm):
            field1 = fields.CharField()
            ...
            class Meta:
                entangled_fields = {'scope': ['field1', ...]}
        

        EntangledModelForm 类是 Django ModelForm 的特殊变体,必须从第三方库 django-entangled 导入。

        这允许您编辑一个或多个 JSON 字段,并具有标准 Django 表单提供的所有好处,例如表单验证和数据清理。

        【讨论】:

          【解决方案5】:

          有一个最流行的 github 存储库,它实现了 JSONField。 你可以安装它:

          pip install jsonfield
          

          例如,如果你有一个模型

          from jsonfield import JSONField
          from django.db import models
          
          
          class MyModel(models.Model):
              json_field = JSONField(default='', blank=True)
          

          您可以简单地定义一个带有 JSON 验证的表单

          from django import forms
          from jsonfield.fields import JSONFormField
          from myapp import models
          
          
          class MyModelForm(forms.ModelForm):
              class Meta:
                  model = models.MyModel
                  fields = '__all__'
                  field_classes = {
                      'json_field': JSONFormField,
                  }
          

          并在您的管理模型中使用此表单

          from django.contrib import admin
          
          from myapp.forms import MyModelForm
          from myapp.models import MyModel
          
          
          @admin.register(MyModel)
          class MyModelAdmin(admin.ModelAdmin):
              form = MyModelForm
          

          【讨论】:

            【解决方案6】:

            django.contrib.postgres 有一个 JSONField 表单字段。这是docs 的链接。字段由 HTML &lt;textarea&gt; 表示。

            from django import forms
            from django.contrib.postgres.forms.jsonb import JSONField
            
            class ExampleForm(forms.Form):
                ...
            
                metadata = JSONField()
                ...
            

            【讨论】:

              【解决方案7】:

              简单来说:

              您不想更改所有表单的默认行为,只需使用一个函数即可将您的请求转换为对象。

              form = myForm(jsonForm(request))
              
              if form.is_valid():
                 # Continue your stuffs 
              

              您可以将请求正文转换为 Python 对象并传递给您的表单,而不是直接传递请求。

              def jsonForm(req):
                  return json.loads(req.body.decode('utf-8'))
              

              【讨论】:

                猜你喜欢
                • 2019-12-31
                • 2018-11-07
                • 2014-12-21
                • 2014-02-22
                • 2016-12-20
                • 2020-12-23
                • 2017-09-10
                • 2020-04-06
                • 2012-08-23
                相关资源
                最近更新 更多