2014-09-24 123 views
2

我有一個表單,用戶輸入有關位置的信息。我正在嘗試製作更新表單,以便用戶可以單擊某個位置上的更新按鈕,並使用該位置已存在的數據填充更新表單。我遵循Django文檔,但我得到一個空白屏幕。我不確定如何讓它引用要更新的位置。這是我到目前爲止。Django更新表單?

models.py

class Location(models.Model): 
    # Details on location 

views.py

def locations(request): 
     return render_to_response('locations/locations.html', {'locations': Location.objects.all() }) 

    def location(request, location_id=1): 
     return render_to_response('locations/location.html', {'location': Location.objects.get(id=location_id) }) 

    def create(request): 
     if request.POST: 
      form = LocationForm(request.POST, request.FILES) 
      if form.is_valid(): 
       form.save() 

       return HttpResponseRedirect('/accounts/loggedin/locations/all/') 
     else: 
      form = LocationForm() 

     args = {} 
     args.update(csrf(request)) 

     args['form'] = form 

     return render_to_response('locations/create_location.html', args) 

def edit_location(request): 

    if request.POST: 
     form = LocationUpdate(request.POST, request.FILES) 
     if form.is_valid(): 
      form.save() 

      return HttpResponseRedirect('/accounts/loggedin/locations/all/') 
    else: 
     form = LocationUpdate() 

    args = {} 
    args.update(csrf(request)) 

    args['form'] = form 

    return render_to_response('locations/location_update.html', args) 

forms.py

from django.views.generic.edit import UpdateView 
from models import Location 

class LocationForm(forms.ModelForm): 

    class Meta: 
     model = Location 
     exclude = ('timestamp', 'updated') 

class LocationUpdate(UpdateView): 
    model = Location 
    template_name_suffix = '_update_form' 

url.py

url(r'^accounts/loggedin/location/update/$', 'assessments.views.edit_location'), 

location_update.html

<!DOCTYPE html> 
    <html> 
     <head> 

     </head> 
     <body> 
     <form action="" method="post">{% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" value="update" /> 
    </form> 
     </body> 
    </html> 

,或者它應該在location.html去。如果我在那裏添加它,我得到一個CSRF verification failed錯誤

<div class="row"> 
     <div class="col-md-4"> 
      <dl class="dl-horizontal"> 
       <dt>ID:</dt> 
       <dd>{{ location.id }}</dd> 
       <br /> 
       <dt>Company:</dt> 
       <dd>{{ location.company }}</dd> 
       <dt>Address:</dt> 
       <dd>{{ location.address }}</dd> 
       <dt>Town:</dt> 
       <dd>{{ location.town_city }}</dd> 
       <dt>County:</dt> 
       <dd>{{ location.county }}</dd> 
       <dt>Telephone:</dt> 
       <dd>{{ location.tel }}</dd> 
       ###### ect ##### 
    </div> 
</div> 
<form action="" method="post">{% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit" value="update" /> 
    </form>  
+0

這是您的location_update.html的完整代碼嗎?你可能沒有擴展另一個模板? – 2014-09-24 09:29:17

+0

出於測試目的,它只是得到了html標題和body標籤。一旦它正在工作,我會將其添加到模板。它是否需要成爲location.html的一部分? – 2014-09-24 09:31:09

+0

我不明白這個答覆。這是location_update.html的完整代碼嗎?如果沒有,請發佈完整的代碼。另外,請正確解釋*您看到的內容。你有什麼表現嗎?當你查看源代碼時你看到了什麼? – 2014-09-24 09:33:10

回答

7

我看到了幾個問題:

  1. 你更新視圖是完全一樣的創建視圖。
  2. 您在更新視圖中通過UpdateView類作爲窗體。

如果您打算使用更新視圖,則無需將其包裝在另一個視圖中或將其用作表單,它完全是獨立的。

在你views.py(不forms.py):

from .models import Location 
from .forms import LocationForm 

class LocationUpdateView(UpdateView): 
    model = Location 
    template_name = 'locations/location_update.html' 
    form_class = LocationForm 
    success_url = '/accounts/loggedin/locations/all/' 

在你urls.py

url('location/update/(?P<pk>\d+)/$', LocationUpdateView.as_view(), 
            name='location-update'), 

如連接起來這樣,你需要調用與主更新視圖要更新的位置對象的關鍵字。這將確保表單中填充了數據;所以這樣稱呼它<a href="{% url 'location-update' pk=1 %}">update location id 1</a>

如果你不想使用基於類的視圖,那麼你的視圖應該被更新來首先加載數據,填充表單,然後發送表單給用戶,就像上面的UpdateView一樣,你需要傳入主鍵(或其他參考),以加載正在編輯記錄的對象:

def update_location(request, pk=None): 
    obj = get_object_or_404(Location, pk=pk) 
    form = LocationForm(request.POST or None, 
         request.FILES or None, instance=obj) 
    if request.method == 'POST': 
     if form.is_valid(): 
      form.save() 
      return redirect('/accounts/loggedin/locations/all/') 
    return render(request, 'locations/location_update.html', {'form': form}) 
+0

感謝您的詳細回覆。 django的其他領域也有幫助,我不確定。最後一件事是,當我點擊發布更新'沒有URL重定向到'時,我收到錯誤。提供一個url或在模型上定義一個get_absolute_url方法。'我用你建議的第一種方法 – 2014-09-24 10:29:00

+0

對不起,我更新了答案。 – 2014-09-24 10:31:04

+0

完美。非常感謝! – 2014-09-24 10:35:12