[英]How can I use GET and POST on the same form in Django
我有一个项目 wiki,使用来自 CS50W 的 Django 和 python 并停留在我必须检查标题是否存在的地方,如果它存在,我将提供消息和选项来更改标题或编辑它,现在这部分正在使用 GET 方法,如果主题不存在,它会将焦点设置为 textarea,用户可以广告有关标题的信息并将其保存到新文件中,现在使用methot=POST。 如果我编写以下代码,我的检查工作
createNewPage.html
<div class="form-group" style="margin-right: 20%">
<form id="newTitle" action="{% url 'save' %}" method="GET">
{% csrf_token %}
{% block newTitle %}
<label>{{ newTitle_form.title.label }}</label>
{{ newTitle_form.title }}
{% endblock %}
</form>
{% if messages %}
<div id="messageDiv" class="alert alert-info" role="alert">
{% for message in messages %}
{{ message }}
{% endfor %}
</div>
{% endif %}
{% if messages %}
<div class="h1 flex-container btn-save-placement" style="height: 0px; padding-top: 0px; margin-right: 0%">
<div>
<a role="button" id="changeTopic" class="btn btn-outline-dark" href="{% url 'new_topic' %}">Change</a>
<a role="button" class="btn btn-outline-dark" href="{% url 'edit' pagetitle %}">Edit</a>
</div>
</div>
{% endif %}
</div>
<div class="form-group" style="margin-right: 20%; margin-top: 25px">
{% block textArea %}
<label>{{ newText_form.text.label }}</label>
{{ newText_form.text }}
{% endblock %}
</div>
<div class="btn-save-placement flex-container" style="height: 48px; padding-top: 0px;">
<button class="btn btn-outline-dark" href="{% url 'save' %}" type="submit" formmethod="POST">Save New Page</a>
</div>
<script>
function blurFunction() {
var newTitleText = document.getElementById("titleCheck");
if (newTitleText.value !== null && newTitleText.value !== "") {
document.getElementById("newTitle").requestSubmit();
}
}
</script>
如果我从第 8 行更改为第 35 行,然后检查将不起作用,但它会保存新文件。 我可以改变什么来让两者都工作。
视图.py
def save(request):
if request.method == "GET":
searchPage = request.GET.get('title','')
if(util.get_entry(searchPage) is not None):
messages.info(request, 'The Page ' + searchPage + ' Already Exists, Do You Want To Change It Or Edit It!')
return HttpResponseRedirect(reverse("new_topic_t", kwargs={'entry': searchPage}))
else:
return HttpResponseRedirect(reverse("new_topic_t", kwargs={'entry': searchPage}))
else:
title = request.POST["title"]
content = request.POST["text"]
util.save_entry(title, content)
return HttpResponseRedirect(reverse("generate_page", kwargs={'entry': title}))
forms.py
class newTitle(forms.Form):
title = forms.CharField(label='New Page Title', max_length=100, widget=forms.TextInput(
attrs={
'id': 'titleCheck',
'class': 'search',
'type': 'text',
'placeholder': 'Type Topic Title Here...',
'onblur': 'blurFunction()',
'value': ''
}))
text = forms.CharField(label='Enter Page Text', widget=forms.Textarea(
attrs={
'id': 'NewTopicText',
'class': 'form-control',
'rows': '14'
}))
你可以这样使用:
def save(request):
if request.method == "GET":
searchPage = request.GET.get('title','') # consider using snake_case
if(util.get_entry(searchPage) is not None):
messages.info(request, 'The Page ' + searchPage + ' Already Exists, Do You Want To Change It Or Edit It!')
return HttpResponseRedirect(reverse("new_topic_t", kwargs={'entry': searchPage}))
else:
form = newTitle() # consider using PascalCase
return render('createNewPage.html', context={'newText_form': form})
else:
form = newTitle(request.POST)
if form.is_valid():
title = form.cleaned_data["title"]
content = form.cleaned_data["text"]
util.save_entry(title, content)
return HttpResponseRedirect(reverse("generate_page", kwargs={'entry': title}))
else:
return render('createNewPage.html', context={'newText_form': form}) # will render errors in the html page
仅供参考,根据PEP-8 指南,您应该将变量和方法命名为 snake_case,Class 命名为 PascalCase。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.