Я пытаюсь создать форму, которая работает с объектом Tool
, который связан с одним пользователем.Django ModelForm, создающий новый экземпляр вместо обновления существующей записи базы данных
class Tool(models.Model):
owner = models.ForeignKey(BaseUser)
tool_type = models.CharField(('tool_type'), max_length=40, blank=True)
description = models.CharField(('description'), max_length=100, blank=True)
available = models.BooleanField()
Этот инструмент обновляется с помощью этой формы
class ToolForm(forms.ModelForm):
tool_type = forms.CharField(max_length=40, label="Tool Type: ")
description = forms.CharField(max_length=100, label="Description: ")
available = forms.BooleanField(required = False)
owner = forms.ModelChoiceField(queryset = BaseUser.objects.all(),
widget=forms.HiddenInput())
class Meta:
model = Tool
Инструмент выполнен этим видом
@login_required
def tool_register(request):
if request.method == 'POST':
frm = ToolForm(request.POST)
print(request.user)
if frm.is_valid():
frm.save()
return render_to_response('tools/tool_register_success.html')
else:
frm = ToolForm(initial = {'owner':request.user})
args = {}
args.update(csrf(request))
args['form'] = frm
args['activeuser'] = request.user
return render_to_response('tools/tool_register.html', args)
И это, где проблема. Я обновляю этот инструмент.
@login_required
def tool_edit(request, tool_id):
curr_tool = Tool.objects.get(pk = tool_id)
if request.method == 'POST':
frm = ToolForm(request.POST, instance = curr_tool)
if frm.is_valid():
frm.save(force_update = True)
return render_to_response('tools/tool_edit_success.html')
else:
frm = ToolForm(instance = curr_tool)
args = {}
args.update(csrf(request))
args['form'] = frm
return render_to_response('tools/tool_edit.html', args)
Но это создает новый экземпляр данного инструмента с обновленной информацией вместо обновления существующего. Обратите внимание, что я использую обычный instance = x
. Инструмент связан с одним BaseUser
. Если это имеет значение, вот этот код.
class BaseUser(AbstractUser):
zipcode = models.IntegerField(('Zipcode'), max_length=5, blank=True)
address = models.CharField(('Address'), max_length=40, blank=True)
shown_username = 'username'
class Meta:
verbose_name = 'Base User'
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['first_name',
'last_name',
'email',
'zipcode',
'address',
]
Я немного потерян. Все, что я прочитал, сказал, что это должно быть обновление, а не создание.
Почему он создает новый экземпляр вместо обновления моего старого экземпляра? Как я могу исправить код, чтобы он обновил мой старый экземпляр?
AFAIK, 'force_updaet = true' относится к' Model.save() 'метод, я не уверен, если' ModelForm.save() 'метод распознает это ключевое слово. Я проверил эту страницу, не упоминается 'force_update': https://docs.djangoproject.com/en/dev/topics/forms/modelforms – Raiyan
Вы уверены, что отправляете правильный метод? Можете ли вы показать шаблон? –