Python - Django 2.0 - URL模式,传递参数

时间:2018-01-28 21:39:23

标签: python html django python-3.6 django-2.0

我正在用Python编写一个非常基本的网页,其中有一个文本框,用户可以输入用户名,然后点击Ok按钮,使用GET请求提交表单。 GET将用户名作为参数传递,并搜索数据库中的auth_user表。

我的问题是我无法传递用户名参数,请帮助,如果你可以Django 2.0网址模式

urls.py

app_name = 'just_gains'
    urlpatterns = [
        path('lifecoaching', views.LifeCoach, name='life_coaching'),
        path('lifecoaching/resultslifecoaching/<str:user_name>', views.LifeCoachSearchResults, name='results_life_coaching'),
    ]

forms.py

class LifeCoachSearch(forms.Form):
    user_name = forms.CharField(label='Username', max_length=100, required = False)

views.py

def LifeCoach(request):
    if request == 'GET':
        form = LifeCoachSearch(request.GET)
        if form.is_valid:
            user_name = form.cleaned_data['user_name']
            LifeCoachSearchResults(request,user_name)

    else:
        form = LifeCoachSearch()
        return render(request, 'just_gains/life_coaching.html', {'form': form})

def LifeCoachSearchResults(request, user_name):

    testUser = User.objects.filter(username__startswith=user_name)
    context = {'TestUser': testUser}
    return render(request, 'just_gains/results_life_coaching.html', context)

HTML(生活教育)

<form action="{% url 'just_gains:results_life_coaching' %}" method="GET" >
    {% csrf_token %}
    {{ form }}     
    <input type="submit" value="OK">
</form>

HTML(resultslifecoaching)

<ul>
    <li><a>print usernames that match the argument</a></li>
</ul>

2 个答案:

答案 0 :(得分:1)

请原谅我在移动设备上的简短回复。尝试使用<str:user_name>

在路径中将您的用户名作为字符串传递

答案 1 :(得分:0)

通常我认为表单应该通过POST而不是GET提交,然后提交的用户名的值将在字典request.POST ['username']中提供。应该使用GET从服务器获取表单; POST将信息发回服务器。 POST确保浏览器捆绑表单中的所有内容并将其发送完整,但GET会尝试在URL中对其进行编码并且不做任何保证。

使用表单,有助于使View分割以便GET请求拉出空白或预先填充的表单(空搜索框)和POST请求,并将其重定向到您拥有的参数化结果屏幕。

然后,您将创建一个httpRedirect,以使用参数将请求重新分配给您的URL。我认为这个链接,例2是正确的方法。

https://docs.djangoproject.com/en/2.0/topics/http/shortcuts/#redirect

所以你的功能看起来像是:

def LifeCoach(request):
    if request.method = 'GET':
       return render(request, 'just_gains/life_coaching.html', context)
    elif request.method = 'POST':
       # I have skipped form validation here for brevity        
       return redirect('results_life_coaching',request.POST['username'])

使用request.USER ['username']时,有一个名为username的字段可能会与您发生冲突或混淆。别忘了改变你的表格html!一切顺利!

[编辑1]我的代码错了; GET应该调用lifecoaching表单,POST应该重定向到results_life_coaching页面。

[编辑2]我对您的模板的建议:

HTML(lifecoaching.html)

<form action="{% url 'just_gains:life_coaching' %}" method="POST" >
    {% csrf_token %}
    {{ form }}     
    <input type="submit" value="OK">
</form>

HTML(resultslifecoaching.html)

<ul>
 {% for item in username_list %}
    <li>{{item.user_name}} - {{item.achievement}} </li>
 {% endfor %}
</ul>