我使用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>
这里有使用一个FormView没有意义的;您已经通过重写'get'和'post'来绕过其所有功能。 –
无论如何,你现在在'post'中做的所有验证都应该在窗体的'clean'方法中完成。 –
@丹尼罗斯曼是的,你说得对,我会修复这个 – CNB