SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 67ac2c59 authored by Geert Kapteijns's avatar Geert Kapteijns
Browse files

Extract model_form_data to common/helpers

This function helps to create form data from models.
See example given.
parent b4aaa3b5
No related branches found
No related tags found
No related merge requests found
def model_form_data(model, form_class):
'''
Returns a dict that can be used to instantiate a form object.
It fills in the model's data, but filters out fields that are not on the form.
Example:
class Car(models.Model):
brand = CharField(max_length = 50)
fuel_tank_size = FloatField()
# more fields
class CreateCarForm(forms.ModelForm):
fields = ['brand']
my_car = Car(brand='Nissan', fuel_tank_size=60)
model_form_data(my_car, CreateCarForm)
# returns {'brand': 'Nissan'}
Note that the returned dict does not have a field 'fuel_tank_size', because it is not
on the form.
'''
model_data = model.__dict__
form_fields = list(form_class().fields.keys())
return filter_keys(model_data, form_fields)
def filter_keys(dictionary, keys_to_keep):
return {key: dictionary[key] for key in keys_to_keep}
...@@ -5,27 +5,23 @@ from django.test import TestCase ...@@ -5,27 +5,23 @@ from django.test import TestCase
from .factories import ThesisLinkFactory from .factories import ThesisLinkFactory
from .forms import RequestThesisLinkForm from .forms import RequestThesisLinkForm
from common.helpers import model_form_data
def valid_form_data(thesis_link):
thesis_link_data = thesis_link.__dict__
form_fields = list(RequestThesisLinkForm().fields.keys())
return filter_keys(thesis_link_data, form_fields)
def filter_keys(dictionary, keys_to_keep):
return {key: dictionary[key] for key in keys_to_keep}
class TestRequestThesisLink(TestCase): class TestRequestThesisLink(TestCase):
fixtures = ['permissions', 'groups'] fixtures = ['permissions', 'groups']
def setUp(self):
self.valid_form_data = model_form_data(ThesisLinkFactory(), RequestThesisLinkForm)
def test_valid_data_is_valid(self): def test_valid_data_is_valid(self):
thesis_data = valid_form_data(ThesisLinkFactory()) form_data = self.valid_form_data
form = RequestThesisLinkForm(thesis_data) form = RequestThesisLinkForm(self.valid_form_data)
self.assertTrue(form.is_valid()) self.assertTrue(form.is_valid())
def test_empty_domain_is_invalid(self): def test_empty_domain_is_invalid(self):
thesis_data = valid_form_data(ThesisLinkFactory(domain='')) form_data = self.valid_form_data
form = RequestThesisLinkForm(thesis_data) form_data['domain'] = ''
form = RequestThesisLinkForm(form_data)
form.is_valid() form.is_valid()
self.assertEqual(form.errors['domain'], ['This field is required.']) self.assertEqual(form.errors['domain'], ['This field is required.'])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment