Я искал пару дней, чтобы попытаться найти СУХОЙ способ создания динамических форм из 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),
]
Edit
Я первоначально набрал код из памяти и имел некоторые опечатки.Я скопировал код из моей кодовой базы и включил urls.py.