【问题标题】:after redirect - is there a way to remove the form field from the URL in Django?重定向后 - 有没有办法从 Django 的 URL 中删除表单字段?
【发布时间】:2017-12-06 06:30:27
【问题描述】:

发送表单后,我被重定向到另一个页面。

该页面的 URL 将包含 URL + 表单字段名称 + 表单字段值。

有没有办法以 URL 不显示表单字段名称和值的方式重定向(或者可能在不重定向的情况下操作数据)?

我的项目(没有应用程序):

urls.py

from django.conf.urls import url
from . import views

urlpatterns = [

url(r'^$', views.home, name='home'),
url(r'^translate/', views.translate, name='translate'),

]

views.py

from django.shortcuts import render


def home(request):
    return render(request, 'hello.html')


def translate(request):

original = request.GET['originaltext'].lower()
translation = ''
for word in original.split():
    if word[0] in ['a','e','i','o','u']:
        translation += word
        translation +='yay '
    else:
        translation += word[1:]
        translation += word[0]
        translation += 'ay '

return render(request, 'translate.html', {'original':original, 
'translate':translation})

你好.html

<h1> heading title </h1>

<form action="{% url 'translate' %}">
  <input type="text" name="originaltext"/>
  <br/>
  <input type="submit" value="Translate" />
</form>

翻译.html

{{ original }} <br>
{{ translate }}
<br><br>
<a href="{% url 'home' %}">Home</a>

所以每当我发送表单时,我都会被重定向并且 URL 变为:

http://127.0.0.1:8000/translate/?originaltext=user_text

【问题讨论】:

  • 您可以使用 return redirect('urlname') 代替 render 并且您也在使用 request.GET。
  • @VijeshVenugopal,“你也在使用 request.GET”是什么意思?我应该删除它吗?现在使用重定向我收到一个错误 -MultiValueDictKeyError at /translate/translate.html
  • 你在哪里做重定向?
  • 您正在接收作为 GET 参数的参数,这就是您被重定向到上述网址的原因。您可以做的一件事是在当前视图之后重定向到主页或将代码设置为 `request.GET.get('originaltext', None).lower()。
  • 您必须在 html 中呈现表单并在同一视图中提交表单。您尝试在翻译视图中进行的表单操作应该进入主视图本身。操作后,如果您想进行重定向,您可以在主视图中进行。

标签: django django-forms django-views


【解决方案1】:

也许尝试从您的表单发送 POST 请求:

<form action="{% url 'translate' %}" method="POST">{% csrf_token %}
<input type="text" name="originaltext"/>
<br/>
<input type="submit" value="Translate" />
</form>

在你看来:

def translate(request):
    context = {}
    if request.method == 'POST':
        original = request.POST.get('originaltext').lower()
        context['original'] = original
        translation = ''
        for word in original.split():
            if word[0] in ['a','e','i','o','u']:
                translation += word
                translation +='yay '
            else:
                translation += word[1:]
                translation += word[0]
                translation += 'ay '
        context['translation'] = translation
    return render(request, 'translate.html', context)

【讨论】:

  • 它有效!你能解释一下你在那里做了什么吗?
  • 最初您将请求作为 GET 发送。我把它作为POST。 GET 请求会在 url 中公开参数,而 POST 则不会。在视图中,我确保正确处理了 POST 请求。
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多