Implementing reading form fields

This commit is contained in:
Alexander Forselius 2024-01-19 18:05:01 +01:00
parent ade2918d21
commit f9a4305e61
2 changed files with 27 additions and 66 deletions

View File

@ -5,7 +5,7 @@ import graphene
from graphene_django import DjangoObjectType
from ...tests.models import CHOICES, Film, Reporter
from ..types import DjangoFormFieldObjectType, DjangoFormInputObjectType, DjangoFormObjectType
from ..types import DjangoFormFieldObjectType, DjangoFormInputObjectType, DjangoFormObjectType, DjangoFormTypeOptions
# Reporter a_choice CHOICES = ((1, "this"), (2, _("that")))
THIS = CHOICES[0][0]
@ -40,41 +40,16 @@ class MyForm(forms.Form):
class ReporterFormType(DjangoFormObjectType):
class Meta:
form_class = ReporterForm
def test_needs_form_class():
with raises(Exception) as exc:
class MyFormType(DjangoFormObjectType):
pass
assert exc.value.args[0] == "form_class is required for DjangoFormObjectType"
def test_type_form_has_fields():
class ReporterFormType(DjangoFormObjectType):
class Meta:
form_class = ReporterForm
only_fields = ("first_name", "last_name", "a_choice")
fields = ["first_name", "last_name", "a_choice", "id"]
assert all(f in ReporterFormType._meta.fields for f in fields)
def test_type_form_has_fields():
class MyFormFieldType(DjangoFormFieldObjectType):
class Meta:
form_class = MyForm
fields = ["text_field", "int_field", "id"]
assert all(f in MyFormFieldType._meta.fields for f in fields)
form_class = ReporterForm
only_fields = ('pets', 'email')
def test_query_djangoformtype():
class MyFormType(DjangoFormObjectType):
class Meta:
form_class = MyForm
form_class = MyForm
only_fields = ('text_field', 'int_field')
exclude_fields = []
class MockQuery(graphene.ObjectType):
form = graphene.Field(
@ -106,11 +81,11 @@ def test_query_djangoformtype():
"fields": [
{
"name": "text_field",
"type": "CharField"
"type": "String"
},
{
"name": "int_field",
"type": "IntegerField"
"type": "Int"
}
]
}

View File

@ -8,8 +8,9 @@ from graphene.utils.str_converters import to_camel_case
from django.db.models import Model
from ..converter import BlankValueField
from ..types import ErrorType # noqa Import ErrorType for backwards compatibility
from ..types import DjangoObjectTypeOptions, ErrorType # noqa Import ErrorType for backwards compatibility
from .mutation import fields_for_form
from graphene.types.objecttype import ObjectTypeOptions
class DjangoFormFieldObjectType(ObjectType):
@ -24,50 +25,35 @@ class DjangoFormFieldObjectType(ObjectType):
)
class DjangoFormTypeOptions(ObjectTypeOptions):
form_class = Form
only_fields = ()
exclude_fields = ()
object_type = Model
class DjangoFormObjectType(ObjectType):
class Meta:
form_class = Form
object_type = Model
only_fields = []
exclude_fields = []
form_class = Form
only_fields = ()
exclude_fields = ()
fields = graphene.List(
DjangoFormFieldObjectType
)
@classmethod
def __init_subclass_with_meta__(
cls,
container=None,
_meta=None,
only_fields=(),
exclude_fields=(),
form_class=None,
object_type=None,
add_id_field_name=None,
add_id_field_type=None,
**options,
):
if not form_class:
raise Exception("form_class is required for DjangoFormObjectType")
super().__init_subclass_with_meta__(container=container, _meta=_meta, **options)
@staticmethod
def resolve_fields(parent, info):
form_class = parent._meta.form_class
def resolve_fields(parent, info):
form_class = parent.form_class
form = form_class()
only_fields = parent._meta.only_fields
exclude_fields = parent._meta.exclude_fields
only_fields = parent.only_fields
exclude_fields = parent.exclude_fields
form_fields = fields_for_form(form, only_fields, exclude_fields)
result = []
type = field.__class__.__name__
for name, field in form_fields.items():
type = field.__class__.__name__
result.append(
DjangoFormFieldObjectType(
name=name,