2014-09-24 76 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