web-dev-qa-db-fra.com

Ajouter des données à l'objet ModelForm avant de sauvegarder

Dites que j'ai un formulaire qui ressemble à ceci:

forms.py

class CreateASomethingForm(ModelForm):
    class Meta:
        model = Something
        fields = ['field2', 'field3', 'field4']

Je veux que le formulaire ait ces trois champs. Cependant, ma Somethingclass a aussi field1. Ma question est la suivante: comment puis-je ajouter des données à field1 si je n'utilise pas la ModelForm pour collecter les données? J'ai essayé de faire quelque chose comme ça, mais ça ne marche pas et je ne sais pas comment résoudre ce problème:

views.py

def create_something_view(request):
    if (request.method == 'POST'):
        # Create an object of the form based on POST data
        obj = CreateASomething(request.POST)
        # ** Add data into the blank field1 ** (Throwing an error)
        obj['field1'] = request.user
        # ... validate, save, then redirect 

L'erreur que je reçois est:

TypeError: 'CreateAClassForm' object does not support item assignment

Dans Django, quel est le moyen approprié d'attribuer des données à un objet ModelForm avant de l'enregistrer?

24
Joker
form = CreateASomething(request.POST)
if form.is_valid():
    obj = form.save(commit=False)
    obj.field1 = request.user
    obj.save()
48
Daniel Roseman

Parfois, le champ peut être obligatoire, ce qui signifie que vous ne pouvez pas le passer au-delà de formulaire.is_valid (). Dans ce cas, vous pouvez transmettre un objet dict contenant tous les champs au formulaire. 

   if request.method == 'POST':
       data = {
        'fields1': request.user,
        'fields2': additional_data,
       }
       form = CreateASomethingForm(data)

    if form.is_valid():
        form.commit(save)
6
eosimosu

Voici un moyen plus approprié d'ajouter des données spécialement utilisées lors des tests:

Commencez par convertir une entrée existante dans un dictionnaire avec la fonction model_to_dict

from Django.forms.models import model_to_dict

...

valid_data = model_to_dict(entry)

Puis ajoutez les nouvelles données dans ce dictionnaire

valid_data['finish_time'] = '18:44'

Cela fonctionne mieux que de définir la valeur sous la forme

update_form.finish_time = '18:44'

Créer le formulaire avec les données valides et l'instance

update_form = UserEntryForm(valid_data, instance=entry)

Faites les affirmations dont vous avez besoin:

self.assertTrue(update_form.is_valid())
entry = update_form.save()
self.assertEqual(
    entry.status,
    1
)
0
surfer190