Ответ 1
form = CreateASomething(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.field1 = request.user
obj.save()
Скажем, у меня есть форма, которая выглядит так:
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
перед сохранением?
form = CreateASomething(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.field1 = request.user
obj.save()
Иногда может потребоваться поле, которое означает, что вы не можете пройти мимо 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)
Вот более подходящий способ добавления данных, особенно используемых во время тестирования:
Сначала преобразуйте существующую запись в словарь с помощью функции 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
)