2013-06-15 6 views
20

sagen, ich habe ein Formular, das wie folgt aussieht:Daten Modelform Objekt hinzufügen vor dem Speichern

forms.py

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

Ich mag die Form diese drei Felder hat. Jedoch hat meine Something Klasse auch field1. Meine Frage ist - wie füge ich Daten zu field1 hinzu, wenn ich die ModelForm nicht verwende, um die Daten zu sammeln. Ich habe versucht, so etwas wie dies zu tun, aber es funktioniert nicht, und ich bin auf dem richtigen Weg, nicht sicher, dies zu lösen:

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 

Der Fehler, den ich erhalten ist:

TypeError: 'CreateAClassForm' object does not support item assignment 

In Django, was ist die richtige Methode, um Daten zu einem ModelForm Objekt vor dem Speichern zuzuordnen?

Antwort

41
form = CreateASomething(request.POST) 
if form.is_valid(): 
    obj = form.save(commit=False) 
    obj.field1 = request.user 
    obj.save() 
+0

Danke - einen dummen Fehler auf Mein Ende verwendet einen Listenzugriffsaufruf, um das Attribut eines Objekts zu erhalten. – Joker

+2

Für klassenbasierte Ansichten können Sie auch [form_valid-Methode überschreiben] (https://docs.djangoproject.com/en/1.5/topics/class-based-views/generic-editing/#basic-forms) hinzufügen Art von Informationen, dann rufen Sie 'super (MyView, self) .form_valid (form)' ', um den gleichen Effekt zu erzielen. –

+0

Gibt es eine Möglichkeit, die Speichermethode des Formulars zu überschreiben, um dasselbe zu erreichen? – jvannistelrooy

6

Manchmal kann das Feld erforderlich sein, was bedeutet, dass Sie es nicht über form.is_valid() hinaus schaffen können. In diesem Fall können Sie ein dict-Objekt mit allen Feldern an das Formular übergeben.

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

    if form.is_valid(): 
     form.commit(save) 
0

Hier ist ein geeigneter Weg, um Daten vor allem während des Tests verwendet, um hinzuzufügen:

Zuerst konvertieren Sie einen bestehenden Eintrag in ein Wörterbuch mit dem die neuen Daten hinzufügen

from django.forms.models import model_to_dict 

... 

valid_data = model_to_dict(entry) 

Dann model_to_dict Funktion in Dieses Wörterbuch

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

Dies funktioniert besser den Wert in Form

update_form.finish_time = '18:44' 

Erstellen Sie das Formular mit den gültigen Daten und die Instanz

update_form = UserEntryForm(valid_data, instance=entry) 

Sie alle Behauptungen als Einstellung, die Sie benötigen:

self.assertTrue(update_form.is_valid()) 
entry = update_form.save() 
self.assertEqual(
    entry.status, 
    1 
) 
Verwandte Themen