2013-06-15 41 views
20

Nói rằng tôi có một hình thức trông như thế này:Thêm dữ liệu vào đối tượng ModelForm trước khi lưu

forms.py

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

Tôi muốn các biểu mẫu để có ba lĩnh vực. Tuy nhiên lớp học Something của tôi cũng có field1. Câu hỏi của tôi là - làm cách nào để thêm dữ liệu vào field1, nếu tôi không sử dụng số ModelForm để thu thập dữ liệu. Tôi đã cố gắng làm một cái gì đó như thế này, nhưng nó không phải đang làm việc và tôi không chắc trên con đường đúng đắn để giải quyết này:

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 

Các lỗi tôi nhận được là:

TypeError: 'CreateAClassForm' object does not support item assignment 

Trong Django, cách thích hợp để gán dữ liệu cho đối tượng ModelForm trước khi lưu là gì?

Trả lời

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

Cảm ơn bạn - một sai lầm ngớ ngẩn trên kết thúc của tôi bằng cách sử dụng một cuộc gọi truy cập danh sách để có được một thuộc tính của đối tượng. – Joker

+2

Đối với các chế độ xem dựa trên lớp, bạn cũng có thể [ghi đè phương thức form_valid] (https://docs.djangoproject.com/en/1.5/topics/class-based-views/generic-editing/#basic-forms) để thêm loại thông tin, sau đó gọi 'super (MyView, self) .form_valid (form)' để đạt được hiệu quả tương tự. –

+0

Có cách nào để ghi đè lên phương thức lưu của biểu mẫu để đạt được điều tương tự không? – jvannistelrooy

6

Đôi khi, trường có thể được yêu cầu có nghĩa là bạn không thể đặt biểu mẫu trong quá khứ.is_valid(). Trong trường hợp đó, bạn có thể chuyển đối tượng dict chứa tất cả các trường vào biểu mẫu.

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

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

Dưới đây là một cách phù hợp hơn để thêm dữ liệu đặc biệt được sử dụng trong thử nghiệm:

Đầu chuyển đổi một mục nhập hiện có thành một cuốn từ điển với model_to_dict chức năng

from django.forms.models import model_to_dict 

... 

valid_data = model_to_dict(entry) 

Sau đó, thêm dữ liệu mới vào từ điển này

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

Điều này hoạt động tốt hơn hơn thiết lập các giá trị ở dạng

update_form.finish_time = '18:44' 

Tạo mẫu với các dữ liệu có giá trị và các trường hợp

update_form = UserEntryForm(valid_data, instance=entry) 

Làm bất cứ khẳng định bạn cần:

self.assertTrue(update_form.is_valid()) 
entry = update_form.save() 
self.assertEqual(
    entry.status, 
    1 
) 
Các vấn đề liên quan