Джанго JsonField для форм - PullRequest
       20

Джанго JsonField для форм

0 голосов
/ 04 октября 2018

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

...