Подтвердить что ты не робот

Добавление данных в объект 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 перед сохранением?

4b9b3361

Ответ 1

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

Ответ 2

Иногда может потребоваться поле, которое означает, что вы не можете пройти мимо 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)

Ответ 3

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

Сначала преобразуйте существующую запись в словарь с помощью функции 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
)