首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django JsonField to forms

Django JsonField to forms
EN

Stack Overflow用户
提问于 2018-10-04 20:57:47
回答 1查看 1.4K关注 0票数 4

我已经搜索了几天,试图找到一种简单的方法,使用django内置的验证和表单呈现功能,从JsonField创建动态表单。我还没有找到一个包含django的验证和渲染的解决方案,所以我想为此创建一个模块,但我很难弄清楚这些类是如何工作的。

我尝试了几种不同的方法,例如:

models.py

代码语言:javascript
复制
from django.contrib.postgres.fields import JSONField
from django.db import models

class Forklift(models.Model):
    name = models.CharField(max_length=50)
    json_fields = JSONField()

forms.py

代码语言:javascript
复制
from django import forms
from .models import Forklift

fields_dict = {
    'name': forms.CharField(max_length=25),
    'number': forms.IntegerField()
}

class ModelForm(forms.ModelForm):
    class Meta:
        model = Forklift
        exclude = ['json_fields']

class DynamicForm(forms.Form):
    pass

这是我得到的错误:

错误

代码语言:javascript
复制
TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

它看起来像forms.Form的子类forms.BaseFormforms.DeclaritaveFieldsMetaclass,但是我想不出如何子类forms.Form来传入字典中的动态字段。我还尝试了以下几种方法:

views.py

代码语言:javascript
复制
from django import forms
from django.shortcuts import render
from .forms import fields_dict

def dynamic_form(request): #__init_subclass__() takes no keyword arguments
    class NewForm(forms.BaseForm, fields=fields_dict): # also tried with fields=fields_dict
        pass
    form = NewForm(request.POST or None)
    return render(request, 'template.html', {'form': form})

def dynamic_form(request): # form will only render once then disappear
    content = {}
    context = {}

    dynamic_form = type('dynamic_form', (DynamicForm,), fields_dict)
    form = dynamic_form(content)

    context = {
        'form': form,
    }
    return render(request, 'activity/dynamic_form.html', context)


def dynamic_form(request): # module 'django.forms' has no attribute 'DeclaritaveFieldsMetaclass'
    class NewForm(forms.BaseForm, metaclass=DeclarativeFieldsMetaclass(MediaDefiningClass),  data=fields_dict):
        pass
    form = NewForm(request.POST or None)
    return render(request, 'template.html', {'form': form})

我不仅仅是想要一个答案,我真正想知道的是,人们是如何遍历所有这些类的,以找出如何对它们进行子类化。我想我可以通过自己编写所有的逻辑、验证等来弄清楚如何让它工作,但我希望这是一个其他人可以使用的模块。

urls.py

代码语言:javascript
复制
from django.urls import path

from .views import dynamic_form, test

urlpatterns = [
    path('form/', dynamic_form),
]

编辑

我最初是从内存中输入代码的,但有一些打字错误。我从我的代码库中复制了代码,并包含了urls.py。

EN

回答 1

Stack Overflow用户

发布于 2021-04-14 05:47:33

看一下这个第三方软件包django-entangled,然后将表单重写为

代码语言:javascript
复制
from entangled.forms import EntangledModelForm

class DynamicForm(EntangledModelForm):
    name = forms.CharField(max_length=25)
    number = forms.IntegerField()

    class Meta:
        model = Forklift
        entangled_fields = {'json_fields': ['name', 'number']}

然后,在使用标准Django表单时,像往常一样呈现表单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52647346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档