4

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.BaseFormforms.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 を含めました。

4

1 に答える 1

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 フォームを使用する場合と同じようにフォームをレンダリングします。

于 2021-04-13T21:47:32.857 に答える