2016-09-12 63 views
0

我有一個非常簡單的模型......是這樣的:在同一頁上幾種形式使用Django

class MachineTransTable(models.Model): 
    ... 
    file = models.ForeignKey('File', related_name='the_file') 
    source = models.TextField() 
    target = models.TextField() 
    ... 

我希望做的是有其中用戶已經在源上一個頁面左側(禁用),右側目標(可編輯)和一個提交按鈕,用於發佈MachineTransTable表中每個選定對象的已編輯目標文本。這裏有一些更多的信息,以便更好地理解我的要求:

  • 一頁指的是單個文件,並有在MachineTransTable表對象的幾個(通常是數百)屬於同一個文件
  • 每次用戶編輯單個目標並點擊該對象的提交按鈕,該對象被保存/更新(取決於對象的初始值)並且用戶可以繼續編輯所有其他對象...
  • 在頁面末尾有另一個提交按鈕,用於在工作結束時從頁面退出(所有對象都已被編輯/更新)。如果一個對象沒有被編輯/更新,它會保持其原始值。

我試圖用一個formset,但我想這不是正確的選擇......這是文件forms.py

class SegmentForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(SegmentForm, self).__init__(*args, **kwargs) 
     if self.instance.id: 
      self.fields['source'].widget.attrs['readonly'] = True 

    class Meta: 
     model = MachineTransTable 
     fields = ['source','target',] 

SegmentFormSet = inlineformset_factory(File, MachineTransTable, form=SegmentForm, fields=('source','target'), extra=0) 

和view.py文件是:

class CatUpdateView(LoginRequiredMixin,UpdateView): 

    Model = MachineTransTable 
    context_object_name = 'file' 
    template_name = 'app_cat/cat.html' 
    form_class = SegmentForm 
    ... 
    def get_context_data(self, **kwargs): 
     context = super(CatUpdateView, self).get_context_data(**kwargs) 
     formset = SegmentFormSet(instance=self.get_object()) 
     context['formset_Segment'] = formset 
     return context 

使用這種方法,我有一個單一的表格,當提交按鈕被擊中時,所有相關的對象被立即保存/更新...

我該怎麼做才能實現我的目標蜷縮在上面?謝謝

+0

所以你有兩種提交按鈕,一個用於單個字段,另一個用於頁面。現在你想讓這個按鈕有效嗎? – Windsooon

+0

問題是不做一個按鈕......問題是如何有幾個(最終成百上千)形式...每個人都有其提交按鈕....我試圖找出如何用Django來做到這一點,但目前我沒有線索......頁面按鈕不是一個真正的問題......我想用一些編碼我可以用jQuery來做,但這是不是我想做的事情......我更喜歡用django製作服務器端解決方案。 – Attilio

回答

0

我認爲你的選擇是正確的,你不應該使用幾個(最終幾百個)形式這裏如果字段在同一模型中。有兩個原因:

  • 你必須做很多重複的工作才能寫出如此多的表格,而且很容易出錯和難以維護。

  • 無論有多少字段被編輯過,您仍然必須連接數據庫並更新記錄,並且它們幾乎是有效的。

但如果你真的想這樣做,你可以使用Ajax當前參數名稱發佈的API,然後更新它,比如,你有目標字段按鈕:

<a href="api/table_id" class="button target">value_in_the_html</a> 

使用AJAX張貼字段名稱和值:

$ajax({ 
    url: "api/table_id", 
    type: "POST", 
    datatype: "json", 
    data: {"field": "target", "value": "value_in_the_html"} 
}); 

在view.py:

def UpdateTable(request, id): 
    field = request.POST.get("field", None) 
    value = request.POST.get("value", None) 
    machine = MachineTransTable.objects.filter(id=id).first() 
    machine.getattr(machine,field) = value 
    machine.save() 
    return HttpResponse("Saved!") 
+0

謝謝艾森,我不知道這就是我正在尋找...讓我試着成爲真正的低級...我在找什麼是在form.py中有一個單一的形式正確的方法照顧對象編輯/更新,一個CBV提供所有不同的形式(每一個都有其唯一的ID)作爲上下文中的列表,以及一個模板,我在這個列表中循環。這樣,我可以在我的頁面中有幾種形式,但沒有重複和DRY被尊重......當然,我可以使用你的建議(ajax部分)來更新目標字段 – Attilio

+0

好的。經過幾次測試後,我意識到在同一頁面中使用多種表單意味着每次更新表單時,我都需要重新加載整個頁面......這不是一種有效的方法......更好地在客戶端上工作jquery和發佈到服務器的每個更新需要時...沒有頁面重新加載和更好的用戶體驗 – Attilio

相關問題