2013-06-25 31 views
4

我在處理如何操作時遇到了一些麻煩。我盡了最大的努力搜索谷歌沒有任何運氣。在is_valid()之前設置表格字段值()

我將開始與一些代碼,並解釋什麼,我試圖做的,因爲我去:

models.py

class Action(models.Model): 
    title = models.CharField(max_length=200) 
    owner = models.ForeignKey(User, related_name='actions') 
    created_by = models.ForeignKey(User, related_name='+', editable=False) 
    modified_by = models.ForeignKey(User, related_name='+', editable=False) 

class ActionForm(ModelForm): 
    class Meta: 
     model = Action 

views.py

默認情況下,有一個下拉字段的所有者。我有一個圖標,允許用戶在文本字段中輸入新的用戶名,而不是所有者。我檢查是否提交了owner_new,如果有,請創建該用戶。然後我需要將owner字段設置爲該值,以便form.is_valid()將成立。

def action_create(request): 
    if request.method == 'POST': 
     form = ActionForm(request.POST) 
     # check if new user should be created 
     if 'owner_new' in request.POST: 
      # check if user already exists 
      user = User.objects.get(username=request.POST.get('owner_new')) 
      if not user: 
       user = User.objects.create_user(request.POST.get('owner_new')) 
      # HERE IS WHERE I'M STUMPED 
      form.owner = user.id 
     if form.is_valid(): # THIS FAILS BECAUSE form.owner ISN'T SET 
      action = form.save(commit=False) 
      action.created_by = request.user 
      action.modified_by = request.user 
      action.save() 
      return redirect('action_register:index') 
    else: 
     form = ActionForm() 
    return render(request, 'actions/create.html', {'form': form}) 

回答

5

你可以試試這個:

def action_create(request): 
    if request.method == 'POST': 
     form = ActionForm(request.POST) 
     # check if new user should be created 
     if 'owner_new' in request.POST: 
      # check if user already exists 
      user, _ = User.objects.get_or_create(username=request.POST.get('owner_new'))     

      updated_data = request.POST.copy() 
      updated_data.update({'owner': user}) 
      form = MyForm(data=updated_data) 

     if form.is_valid(): # THIS FAILS BECAUSE form.owner ISN'T SET 
      action = form.save(commit=False) 
      action.created_by = request.user 
      action.modified_by = request.user 
      action.save() 
      return redirect('action_register:index') 
    else: 
     form = ActionForm() 
    return render(request, 'actions/create.html', {'form': form}) 

這樣做的一個更清潔的方式是:

添加required=Falseowner領域。 現在,

if form.is_valid(): # THIS FAILS BECAUSE form.owner ISN'T SET 
    action = form.save(commit=False) 
    if 'owner_new' in request.POST: 
     user, _ = User.objects.get_or_create(username=request.POST.get('owner_new'))     
     action.owner = user 
    action.created_by = request.user 
    action.modified_by = request.user 
    action.save() 
    return redirect('action_register:index') 
+0

首先,感謝您展示'get_or_create()'函數。我不知道那是存在的。其次,對於form.data ['owner'] = user',我得到一個錯誤'This QueryDict instance is immutable',這是我一直在運行的問題。 Django真的不想讓我搞亂數值。 – Jared

+0

是有用的編輯? – karthikr

+0

是的,非常感謝您的幫助。一個小的變化是'updated_data.update('owner','user')'必須被調用爲'updated_data.update(owner = user)'。 – Jared

1

我進入了類似的情況,無法弄清楚如何按照我想要的方式做到這一點。最後我把一個鏈接放到了一個UserForm,允許用戶創建一個新的owner,然後重定向回ActionForm,實例化表單時包含了參數initial={owner: new_owner}

相關問題