2013-06-15 3 views
20

Say У меня есть форма, которая выглядит следующим образом:Добавить данные в объект ModelForm перед сохранением

forms.py

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

Я хочу форму, чтобы эти три поля. Однако мой класс Something также имеет field1. Мой вопрос: как добавить данные в field1, если я не использую ModelForm для сбора данных. Я пытался делать что-то вроде этого, но это не работает, и я не уверен, на правильном пути, чтобы решить эту проблему:

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 

Ошибка я получаю это:

TypeError: 'CreateAClassForm' object does not support item assignment 

В Django, как правильно назначить данные объекту ModelForm перед сохранением?

ответ

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

спасибо - глупая ошибка на мой конец использует вызов доступа к списку, чтобы получить атрибут объекта. – Joker

+2

Для представлений на основе классов вы также можете [переопределить метод form_valid] (https://docs.djangoproject.com/en/1.5/topics/class-based-views/generic-editing/#basic-forms), чтобы добавить это вид информации, затем вызовите 'super (MyView, self) .form_valid (form)' для достижения такого же эффекта. –

+0

Есть ли способ перезаписать метод сохранения формы для достижения того же? – jvannistelrooy

6

Иногда может потребоваться поле, что означает, что вы не можете пройти мимо form.is_valid(). В этом случае вы можете передать объект dict, содержащий все поля в форме.

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

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

Вот более подходящий способ для добавления данных, особенно используемых в процессе тестирования:

сначала преобразовать существующую запись в словарь с функцией model_to_dict

from django.forms.models import model_to_dict 

... 

valid_data = model_to_dict(entry) 

Затем добавить новые данные в этот словарь

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

Это работает лучше чем установка значения в виде

update_form.finish_time = '18:44' 

Создание формы с действительными данными и экземпляр

update_form = UserEntryForm(valid_data, instance=entry) 

ли какие-либо утверждения, вам требуется:

self.assertTrue(update_form.is_valid()) 
entry = update_form.save() 
self.assertEqual(
    entry.status, 
    1 
) 
Смежные вопросы