【问题标题】:Why is the user logged out after submitting a form in django?为什么用户在django中提交表单后退出?
【发布时间】:2020-07-17 17:12:24
【问题描述】:

当我以登录用户的身份提交表单时,我突然退出了,如下图所示。我还不能嵌入图像,因为我没有 10 名声望。以下是链接图片:

Submitting the Form

After submitting the form

views.index

from django.db import IntegrityError
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from django.urls import reverse

from .models import User, Bid, Auction, Comment

def index(request):
    if request.method == "POST":
        
        title = request.POST["title"]
        bid = int(request.POST["startingBid"])
        category = request.POST["category"]
        image = request.POST["img"]
        description = request.POST["description"]

        listing = Auction(name=title, bid=bid,description=description,url=image, category=category)
        listing.save()

        listings = Auction.objects.all()

        #user.is_authenticated == True here
  
        return render(request, "auctions/index.html", {
            "listings": listings,
            "user": request.user.username,
        })
    return render(request, "auctions/index.html")

urls.py


from . import views

urlpatterns = [
    path("home", views.index, name="index"),
    path("login", views.login_view, name="login"),
    path("logout", views.logout_view, name="logout"),
    path("register", views.register, name="register"),
    path("create", views.create, name="create"),
]

index.html

{% extends "auctions/layout.html" %}

{% block body %}
    <h2>Active Listings</h2>

    {% if not user.is_authenticated %}
        Please login to see active listings.
    {% endif %}
    {% if user.is_authenticated %}
        {% for listing in listings %}
            <div class="card bg-light">
                <div class="card-body">
                    <div class="row">
                        <div class="col-sm">
                            <img src="{% url 'listing.url' %}" class="img-fluid" alt="Listing image">
                        </div>
                        <div class="col-sm">
                            <div class="row">
                                <div class="col">
                                    <h2>{{ listing.name }}</h2>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col">
                                    <h6>Starting Bid: ${{ listing.bid }}</h6>
                                    <p>Category: {{ listing.category }}</p>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col">
                                    <p>{{ listing.description }}</p>
                                </div>
                            </div>
                            <div class="row">
                                <div class="col">
                                    <small class="text-muted">Created {{ listing.dateTime }}</small>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        {% endfor %}
    {% endif %}
{% endblock %}

models.Auction 和 models.User

from django.contrib.auth.models import AbstractUser
from django.db import models
from datetime import datetime
from django.core.validators import MinValueValidator

class User(AbstractUser):
    pass

class Auction(models.Model):
    name = models.CharField(max_length=64,default="")
    bid = models.PositiveIntegerField(validators=[MinValueValidator(0),])
    description = models.CharField(max_length=200, blank=True, default="")
    dateTime = models.DateTimeField(auto_now=True)
    url = models.URLField(max_length=300, default="", blank=True)
    category=models.CharField(max_length=50, default="")

    def __str__(self):
        return f"{self.name}"

当用户提交表单时,views.index 中的 request.method 等于“POST”并且 user.is_authenticated 为 True,直到模板被渲染。我希望将用户带回索引页面。如图所示,“请登录以查看活动列表。”正在显示,这意味着 user.is_authenticated 以某种方式变为错误。为什么会这样?

【问题讨论】:

    标签: python django


    【解决方案1】:

    如我所见,您的 views.index 函数应该覆盖登录。像这样的

    @login_required(login_url = "user:login")
    def index(request):
    

    【讨论】:

      【解决方案2】:

      模板上下文变量 user 设置为用户名 - 而不是 User 实例:

              return render(request, "auctions/index.html", {
              "listings": listings,
              "user": request.user.username,  # change to just request.user
          })
      

      用户没有注销——模板只是检查字符串 username 的 is_authenticated 属性,但显然没有找到。 user.is_authenticated 因此总是错误的。

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 2010-11-24
        • 2016-01-12
        • 2011-07-19
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        相关资源
        最近更新 更多