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 Something
class 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?
form = CreateASomething(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.field1 = request.user
obj.save()
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)
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
)