2016-02-23 18 views
0

我使用Django创建一个应用程序的缺省值。我有一个对象列表,用户可以选择一个,然后转到页面上的该对象的详细信息,然后他们可以更改这些详细信息。但是,此刻,用于更改细节的表单要求用户在更改细节之前输入对象的名称。我想它已经进入了一个默认值,这个默认值应该是用户选择的前一页,即用户选择“object1”上观看的人,他们去的形式改变为“object1”和信息在那个表单的顶部有一个标有'对象名'的标签,输入框中有'object1',用户不需要做任何事情。这里是我的一些代码,我希望这一切都合情合理。有没有人对我如何做到这一点有任何建议?我想我可以使用RESTful API URL,所以url可能类似于/details/2/change_date,那么它可能会访问id 2的名称?如何设置的输入表单以基于用户选择的Django

Urls.py

urlpatterns = [ 
    url(r'^details/$', Info.as_view(), name="server_details"), 
    url(r'^details/([0-9]+)/$', GetDetails.as_view(), name="details"), 
    url(r'^change_date/$', ChangeDateFormView.as_view(), name="change_date"), 
] 

Views.py

class ChangeDateFormView(FormView): 

def get_form_class(self): 
    return ChangeDateForm 

def get_template_names(self): 
    return 'change_date.html' 

# Renders a form on GET and processes it on POST. 
def get(self, request, *args, **kwargs): 
    form_class = self.get_form_class() 
    form = self.get_form(form_class) 
    return self.render_to_response(self.get_context_data(form=form)) 

def post(self, request, *args, **kwargs): 
    form_class = self.get_form_class() 
    form = self.get_form(form_class) 
    if form.is_valid(): 
     form_data = form.cleaned_data 
     name = form.data['name'] 
     new_date = form_data['new_date'] 
     confirm_new_date = form_data['confirm_new_date'] 

     if new_date != confirm_new_date: 
      form._errors["new_date"] = "Dates do not match" 
      return self.form_invalid(form) 

     elif MyObjects.objects.filter(name=name).exists(): 
      MyObjects.objects.filter(name=name).update(date=new_date) 
      return render(request, 'change_data_success.html', {}) 

     else: 
      form.errors['name'] = "doesn't exists" 
      return self.form_invalid(form) 
    else: 
     return self.form_invalid(form) 

模板

<form action="{% url "change_date" %}" method="post"> 
    {% csrf_token %} 
    <div class="form-group cf"> 
     <label for="name" class="col-sm-4 control-label">name:</label> 
     <div class="col-sm-8"> 
      {% render_field form.name type="name" class+="form-control" placeholder="name" %} 
      <span style="color: #FF0000">{{ form.name.errors }}</span> 
     </div> 
    </div> 
    <div class="form-group cf"> 
     <label for="date" class="col-sm-4 control-label">New date:</label> 
     <div class="col-sm-8"> 
      {% render_field form.new_date type="date" class+="form-control" %} 
      <span style="color: #FF0000">{{ form.new_date.errors }}</span> 
     </div> 
    </div> 
    <div class="form-group cf"> 
     <label for="confirm date" class="col-sm-4 control-label">Confirm date:</label> 
     <div class="col-sm-8"> 
      {% render_field form.confirm_new_date type="date" class+="form-control" %} 
      <span style="color: #FF0000">{{ form.confirm_new_date.errors }}</span> 
     </div> 
    </div> 
    <div style="text-align: center"> 
     <button type="submit" class="btn btn-default">Submit</button> 
    </div> 
</form> 
+0

这里有使用一个FormView没有意义的;您已经通过重写'get'和'post'来绕过其所有功能。 –

+0

无论如何,你现在在'post'中做的所有验证都应该在窗体的'clean'方法中完成。 –

+0

@丹尼罗斯曼是的,你说得对,我会修复这个 – CNB

回答

相关问题