微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django 视图返回 POST 而不是 GET 请求

如何解决Django 视图返回 POST 而不是 GET 请求

所以我有这些使用 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,{
            'form2': log_form
            })
    else:
        return render(request,{
            '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>

解决方法

登录页面应该被访问两次:当用户被重定向到它时,所以使用 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 函数的视图中的最佳实践。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。