Python 如何基于用户选择Django将表单中的输入设置为默认值
我正在使用Django创建一个应用程序。我有一个对象列表,用户可以选择一个,然后转到包含该对象详细信息的页面,然后可以更改这些详细信息。但是,目前,用于更改详细信息的表单要求用户在更改详细信息之前输入对象的名称。我希望已输入默认值,此默认值应为用户在上一页上选择和查看的值,即用户选择“object1”,他们转到表单来更改“object1”的信息,表单顶部有一个标签,上面写着“Object name”,输入框中有“object1”,用户不必对其进行任何操作。这是我的一些代码,我希望这一切都有意义。有人对我如何做到这一点有什么建议吗?我想我可以使用RESTful API url,所以url可以是类似于Python 如何基于用户选择Django将表单中的输入设置为默认值,python,django,django-urls,Python,Django,Django Urls,我正在使用Django创建一个应用程序。我有一个对象列表,用户可以选择一个,然后转到包含该对象详细信息的页面,然后可以更改这些详细信息。但是,目前,用于更改详细信息的表单要求用户在更改详细信息之前输入对象的名称。我希望已输入默认值,此默认值应为用户在上一页上选择和查看的值,即用户选择“object1”,他们转到表单来更改“object1”的信息,表单顶部有一个标签,上面写着“Object name”,输入框中有“object1”,用户不必对其进行任何操作。这是我的一些代码,我希望这一切都有意义。
/details/2/change\u date
的东西,那么它可能会访问id 2的名称
url.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>
{%csrf_令牌%}
姓名:
{%render_field form.name type=“name”class+=“form control”placeholder=“name”%}
{{form.name.errors}
新日期:
{%render_field form.new_date type=“date”class+=“form control”%}
{{form.new_date.errors}
确认日期:
{%render_field form.confirm_new_date type=“date”class+=“form control”%}
{{form.confirm\u new\u date.errors}}
提交
我使用RESTful URL成功地做到了这一点
然后我的更改详细信息页面可以使用详细信息页面使用的id。这里使用FormView没有任何意义;您通过覆盖
get
和post
绕过了它的所有功能。您当前在post
中进行的所有验证都应该在表单的clean
方法中完成。@DanielRoseman是的,您是对的,在我相信@bmbbigbang之前,我会修正这个问题:@bmbbigbang当你知道你想要的值是多少时,你不使用initial吗?我希望显示的值是用户在上一页上选择的值,这样我就不知道该值,它会改变。我可能错了。