2016-12-10 32 views
0

我是Django和Python編程新手,現在我正在努力工作:(!! !! 我使用Django Model創建了一個更新/編輯表單表單,但它只是不預先填充表單字段並同時發佈到數據庫。如何預填充一個Django更新表單並將其寫回數據庫

我認爲問題在於:「form = AdvertForm(request.POST或None,request.FILES或None ,例如=形式)」

沒有‘request.POST或無,request.FILES或無’,它預填充字段,但不更新數據庫...

這是我的views.py:

def update_advert(request, id): 
if not request.user.is_authenticated(): 
    return render(request, 'forum/login.html') 
else: 
    form = get_object_or_404(Advert, pk=id) 
    if request.method == 'POST': 
     form = AdvertForm(request.POST or None, request.FILES or None, instance=form) 
     if form.is_valid(): 
      form = form.save(commit=False) 
      form.user = request.user 
      form.save() 
      return redirect('forum:user_account') 
    else: 
     form = AdvertForm(instance=form) 


    context = {'form': form} 
    return render(request, 'forum/update_advert.html', context) 

在它看起來像這樣的時刻,當我嘗試打開更新形式:

opening the form --> not prepopulated :(

回答

0

https://docs.djangoproject.com/en/dev/ref/forms/api/#dynamic-initial-values,你可以使用initial屬性當實例化表單以準備你的表單時。

def update_advert(request, id): 
    if not request.user.is_authenticated(): 
     return render(request, 'forum/login.html') 
    else: 
     advert_obj = get_object_or_404(Advert, pk=id) 


     if request.method == 'POST': 
      form = AdvertForm(request.POST or None, request.FILES or None, instance=advert_obj) 
      if form.is_valid(): 
       form.save() 
       return redirect('forum:user_account') 
     else: 
      # Prepopulation happens here: 
      data = {"some_field": advert_obj.some_val} # Insert all the values of advert_obj here and their field names as keys. 
      form = AdvertForm(initial=data) 


     context = {'form': form} 
     return render(request, 'forum/update_advert.html', context) 

在你AdvertForm,把這個代碼:

class AdvertForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(AdvertForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     instance = super(AdvertForm, self).save(commit=False) 
     instance.user = self.request.user 

     if commit: 
      instance.save() 
     return instance 

首要save方法只是做了你的連接起來,request.user到該實例的意見在做什麼,但是我已經把代碼在表格課上保持你的views簡單。

此外,我可以看到一個令人困惑(但不是至關重要)的問題 - 您混淆了變量名稱。 當致電form = get_object_or_404(Advert, pk=id)時,應該返回到變量名稱,如advert或類似的東西。不是form,因爲我們正在返回一個模型對象而不是表單。同樣,form.save(commit=False)返回一個「實例」而不是一個模型表單。這不會解決你的問題,但應該指出要更清楚地知道返回的是什麼,以及如何命名變量。

+0

謝謝。這真的幫助我更好地理解我的代碼! 但它仍然不會顯示預填充的字段**「request.POST或None,request.FILES或None」** ... 當我剛剛擁有這樣的:**「form = AdvertForm(instance = advert_obj)「**它會顯示我預先填充的字段,但不會將其寫回數據庫... – 2cool4school

+0

您能解釋」show「是什麼意思嗎?代碼,'form = AdvertForm(request.POST or None,request.FILES or None,instance = advert_obj)'當你發佈POST請求時運行,應該更新當前的'advert_obj'。它不會再顯示這些字段,因爲您正在重定向到'forum:user_account'。 –

+0

'else'子句(當您發出'GET'請求時),會將數據預填充到表單域中,如您所述。這工作正常。但是這個部分根本不應該保存到數據庫中,因爲我們只是檢索數據。 'POST'請求​​負責保存(在你的情況下,更新當前的'advert_obj') –

相關問題