【问题标题】:Django view returning POST instead of GET requestDjango 视图返回 POST 而不是 GET 请求
【发布时间】:2021-08-10 05:49:17
【问题描述】:

所以我有这些使用 POST 请求进行注册和登录的工作视图,它们都返回 profile.html。

问题是登录和注册视图在我提交表单(根据 cmd)时返回一个 POST 到登录或注册 url,以运行必要的功能。 这意味着它只是渲染 profile.html,而不是运行 ITS 视图功能。

我如何提交表单向配置文件视图发送 GET,同时仍然让他们为各自的功能发送 POST

观看次数:

def log_in(request):
    if request.method == 'POST':
        form = log_form(request.POST)
        if form.is_valid():
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            user = authenticate(request, username=username, password=password)
            if user is not None:
                print("user exists")
                login(request, user)
                return render(request, 'profile.html')
            else:
                print("user does not exist")
                print(form.errors)
                return render(request, 'login.html', {
                    'form2': log_form
                })
        else:
            return render(request, 'login.html', {
            'form2': log_form
            })
    else:
        return render(request, 'login.html', {
            'form2': log_form
        })


def profile(request, username): 
    if request.method == 'GET':
        user = Users.objects.get(username=username)
        interests = []
        interest_list = Interests.objects.filter(member=user)#i got 5 objs here
        for i in interest_list:
            interests.append(i.item)
            print('added interest')
        info = Bios.objects.get(author=user)
        return render(request, 'profile.html', {
            'user': user,
            "interests": interests,
            'info': info
        })

网址:

urlpatterns = [
    path('reg/', views.register, name='register'),
    path('log/', views.log_in, name='login'),
    path('profile/<str:username>/', views.profile, name='profile'),
    path('feed/', views.feed, name='feed')

] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

登录表单:

<form method='POST' action="{%url 'login' %}">
                        {% csrf_token %}
                        <p>Username: {{form2.username}}</p>
                        <p>Password: {{form2.password}}</p>
                        {{form2.errors}}
                        <input type="submit" value="submit">
                        <p style='margin-top: 10px;'>Don't have an account?<a href="{% url 'register' %}"> Register</a></p>
                    </form>

注册表:

<form method='POST' action="{% url 'register' %}">
                        {% csrf_token %}
                        <p>Username: {{form.username}}</p>
                        <p>Email:    {{form.email}}</p>
                        <p>Password: {{form.password}}</p>
                        <p>Phone:    {{form.phone}}</p>
                        <p>First name:   {{form.first_name}}</p>
                        <p>Last name:    {{form.last_name}}</p>
                        {{form.errors}}
                        {% if form.errors %}
                            {% for field in form %}
                                {% for error in field.errors %}
                                    <p>
                                        <strong>{{ error|escape }}</strong>
                                    </p>
                                {% endfor %}
                            {% endfor %}
                            {% for error in form.non_field_errors %}
                                <p>
                                    <strong>{{ error|escape }}</strong>
                                </div>
                            {% endfor %}
                        {% endif %}
                        <input type='submit' value='Submit'>
                        <p style="margin-top: 5px;">Already have an account?<a href="{% url 'login' %}"> Log In</a></p>
                    </form>

【问题讨论】:

    标签: python django post get request


    【解决方案1】:

    登录页面应该被访问两次:当用户被重定向到它时,使用 GET,以及再次当用户发送填写的表单时,这次使用 POST。您的视图逻辑应处理两种类型的申请:

    def user_login(request):
        if request.POST:
            form = UserForm(request.POST) # note that I renamed your form
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return redirect('profile', kwargs={username=user})
        else: # request is GET
            form = UserForm()
        return render(request, 'login.html', {'form': form})
    
    @require_GET()
    def profile(request, username): 
        user = Users.objects.get(username=username)
        interests = Interests.objects.filter(member=user).values_list('item', flat=True)       
        info = Bios.objects.get(author=user)
        context = {
            'user': user,
            "interests": interests,
            'info': info
        }
        return render(request, 'profile.html', context)
    

    我还稍微更改了配置文件视图,以使用我认为是基于 Django 函数的视图中的最佳实践。

    【讨论】:

    • 起初我只是接受了带有持久问题的更简洁的代码,但我才意识到我可以将用户名参数与重定向一起传递。所以我进口了它,现在我们很好。谢谢!
    • @beatmaister 感谢您的接受!我编辑了代码来修复它。
    猜你喜欢
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    相关资源
    最近更新 更多