Джанго JsonField для форм
Я искал пару дней, чтобы попытаться найти СУХОЙ способ создания динамических форм из JsonField, используя встроенную в django проверку и рендеринг форм. Мне еще предстоит найти решение, которое будет включать проверку и рендеринг django, поэтому я хотел бы создать для этого модуль, но мне трудно разобраться, как работают классы.
Я пробовал пару разных вещей, таких как следующее:
models.py
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
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
Это ошибка, которую я получаю:
ошибка
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.BaseForm
а также forms.DeclaritaveFieldsMetaclass
но я не могу понять, как создавать подклассы форм. Форма для передачи динамических полей из словаря. Я также попробовал следующее:
views.py
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
from django.urls import path
from .views import dynamic_form, test
urlpatterns = [
path('form/', dynamic_form),
]
редактировать
Я первоначально набрал код из памяти и имел некоторые опечатки. Я скопировал код из моей кодовой базы и включил urls.py.
1 ответ
Взгляните на этот сторонний пакет django-entangled, а затем перепишите свою форму как
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.