Djangoの組み込みの検証とフォームレンダリングを使用して、JsonFieldから動的フォームを作成するDRYの方法を見つけるために、数日間検索しました。ジャンゴの検証とレンダリングを組み込むソリューションをまだ見つけていないので、このためのモジュールを作成したいと思いますが、クラスがどのように機能するかを理解するのに苦労しています。
次のようないくつかの異なることを試しました。
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()
フォーム.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
して辞書から動的フィールドを渡す方法を理解できません。私も次のことを試しました:
ビュー.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 を含めました。