2014-10-06 4 views
0

Я пытаюсь создать форму, которая работает с объектом 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', 
    ] 

Я немного потерян. Все, что я прочитал, сказал, что это должно быть обновление, а не создание.

Почему он создает новый экземпляр вместо обновления моего старого экземпляра? Как я могу исправить код, чтобы он обновил мой старый экземпляр?

+0

AFAIK, 'force_updaet = true' относится к' Model.save() 'метод, я не уверен, если' ModelForm.save() 'метод распознает это ключевое слово. Я проверил эту страницу, не упоминается 'force_update': https://docs.djangoproject.com/en/dev/topics/forms/modelforms – Raiyan

+0

Вы уверены, что отправляете правильный метод? Можете ли вы показать шаблон? –

ответ

0

Вы пытались сохранить форму с помощью commit=False, а затем зафиксировать/сохранить экземпляр модели с помощью force_update=True?

Это, как я предлагаю экономить экземпляр инструмента:

if frm.is_valid(): 
    tool = frm.save(commit=False) 
    tool.save(force_update=True) 
Смежные вопросы