2013-02-18 61 views
1

我想用我的Django FormWizard編輯現有的對象。我遵循this blog post中描述的技術,但它不起作用。這裏是我的編輯觀點:編輯Django Formwizard:獲取初始數據

@login_required 
def edit_wizard(request, id): 
    thing = get_object_or_404(Thing, pk=id) 
    if thing.user != request.user: 
     raise HttpResponseForbidden() 
    else: 
     initial = {0: {'year': thing.year, 
         'make': thing.make, 
         'series': thing.series, 
         ....etc. 
         }, 
        1: {'condition': thing.condition, 
         ....etc. 
         }, 
        } 

    form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial_dict=initial) 
    return form(context=RequestContext(request), request=request) 

你能不能幫我找出如何提供初始數據嚮導,這樣我可以允許用戶編輯自己的對象嗎?感謝您的想法!


編輯:(13年2月18日)

是越來越答:

TypeError at /edit/10/ __init__() takes exactly 1 argument (3 given) 

這是由以下@ sneawo的回答解決了,但仍然沒有初始數據過去了,而不是創建新的對象。


編輯:(13年2月19日)

class CreateWizard(SessionWizardView): 
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT)) 
    def done(self, form_list, **kwargs): 
     instance = Thing() 
     for form in form_list: 
      for field, value in form.cleaned_data.iteritems(): 
       setattr(instance, field, value) 
     instance.user = self.request.user 
     instance.save() 
     return render_to_response('wizard-done.html', { 
      'form_data': [form.cleaned_data for form in form_list], 
     }) 
+0

爲什麼你使用'東西=東西''在條件else'(用戶= request.user)? – sneawo 2013-02-18 22:00:45

+0

哦,是的。我的錯。刪除那個條件,但是,現在有一個'TypeError:__init __()只需要1個參數(給出3個)'。上面增加了細節。感謝您的任何想法! – 2013-02-18 22:15:31

+0

你還可以顯示'CreateWizard'類的代碼嗎? – sneawo 2013-02-19 08:35:08

回答

2

作爲每1.4+傳遞的初始數據在initial_dict關鍵字的文檔,用於Django的論據。對於以前的版本(1.3,似乎它沒有在1.3之前)關鍵字參數是最初的。此外,您的初始數據字典中的步驟鍵應該是字符串而不是整數。

initial = {'0': {'year': thing.year, 
       'make': thing.make, 
       'series': thing.series, 
        ....etc. 
       }, 
      '1': {'condition': thing.condition, 
        ....etc. 
       }, 
      } 

UPDATE: 要更新您必須設置ID也相同的對象,否則就沒有辦法Django的知道哪些對象更新。一個簡單的方法是在隱藏字段中傳遞該ID,但是必須在您的(完成)方法中再次執行用戶權限檢查。

initial = {0: {'id': thing.id, 


class CreateWizard(SessionWizardView): 
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT)) 
    def done(self, form_list, **kwargs): 
     id = form_list[0].cleaned_data['id'] 
     thing = get_object_or_404(Thing, pk=id) 
     if thing.user != self.request.user: 
      raise HttpResponseForbidden() 
     else: 
     instance = Thing() 
     for form in form_list: 
      for field, value in form.cleaned_data.iteritems(): 
       setattr(instance, field, value) 
     instance.user = self.request.user 
     instance.save() 
     return render_to_response('wizard-done.html', { 
      'form_data': [form.cleaned_data for form in form_list],}) 

當然StepOneForm,並應具有ID與隱藏字段:

class StepOneForm(forms.Form): 
    id = forms.IntegerField(widget=forms.HiddenInput) 
+0

謝謝@almalki。將初始數據字典設置爲字符串可以讓我在表單中獲得'initial_dict'。但是,創建新實例而不是修改原始實例。你能幫我理解爲什麼嗎?謝謝! – 2013-02-21 18:05:58

+0

@NickB當然,看到更新的答案:) – almalki 2013-02-21 18:24:31

+0

感謝您的幫助@almalki(+1)!在我看來,唯一的問題是'全局名'請求'沒有定義'在'return form'行。我不知道如何正確地返回信息..你有什麼想法如何返回表單?我非常感謝你分享你的知識。謝謝! – 2013-02-21 18:54:24

1

嘗試使用form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial=initial)