首页 > 解决方案 > 渲染views.py“Django”时我很困惑

问题描述

我的 vews.py:

如果您想让我分享另一条信息,请随时询问!我只是出价系统有问题!!,我尝试了出价,但是当我将新号码添加到输入字段中并单击地方出价按钮时,页面刚刚重新加载,这意味着该功能不起作用!当我尝试关闭出价时我遇到了另一个问题我 git 这个 Django 错误

ValueError at /bidding/26
 The view auctions.views.bidding didn't return an HttpResponse object. 
 It returned None instead.

编码:

 def viewList(request, id):
        # check for the watchlist
        listing = Post.objects.get(id=id)
        user = User.objects.get(username=request.user)
        if listing.watchers.filter(id=request.user.id).exists():
                is_watched = True
        else:
                is_watched = False

        if not listing.activate:
              if request.POST.get('button') == "Close":
                  listing.activate = True
                  listing.save()
        else:
            price = request.POST.get('bid', 0)
            bids = listing.bids.all()
        if user.username != listing.creator.username:
            if price <= listing.price:
                return render(request, 'auctions/item.html', {
                    "listing": listing,
                    'form': BidForm(),
                    "message": "Error! Your bid must be largest than the current bid!",
                    'comment_form': CommentForm(),
                    'comments': listing.get_comments.all(),
                    'is_watched': is_watched,
                })
            form = BidForm(request.POST)
            if form.is_valid():
                bid = form.save(commit=False)
                bid.user = user
                bid.save()
                listing.bids.add(bid)
                listing.bid = price
                listing.save()
            else:
                return render(request, 'acutions/item.html', {'form'})
        context = {
          'listing': listing,
          'comment_form': CommentForm(),
          'comments': listing.get_comments.all(),
          'is_watched': is_watched,
          'form': BidForm()}
        return render(request, 'auctions/item.html', context)

模型.py

class Bid(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    bid = models.DecimalField(max_digits=10, decimal_places=2)
    time = models.DateTimeField(default=timezone.now)


class Post(models.Model):
    # data fields
    title = models.CharField(max_length=64)
    textarea = models.TextField()

    # bid
    price = models.FloatField(default=0)
    currentBid = models.FloatField(blank=True, null=True)

    imageurl = models.CharField(max_length=255, null=True, blank=True)
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE, default="No Category Yet!", null=True,  blank=True)

    creator = models.ForeignKey(
        User, on_delete=models.PROTECT, related_name="all_creators_listings")

    watchers = models.ManyToManyField(
        User, blank=True, related_name='favorite')
    date = models.DateTimeField(auto_now_add=True)

    # for activated the Category
    activate = models.BooleanField(default=False)

    bids = models.ManyToManyField(Bid, )

    def __str__(self):
        return f"{self.title} | {self.textarea} |  {self.date.strftime('%B %d %Y')}"

项目.html

            <div class="card-body">
            <ul class="list-group">
                <div class="info">
                    <li class="list-group-item mb-2">Description:<br>{{listing.textarea}}</li>
                    <li class="list-group-item mb-2">category: {{listing.category.name}}</li>
                    <li class="list-group-item mb-2"><h5>Start bid: {{listing.price}}$</h5></li>
                </div>

                <div class="newbid">
                <p>{{ message }}</p>
                <form action="{% url 'viewList' listing.id %}" method="POST">
                    {% csrf_token %}
                    <div class="form-group">
                    <label for="bid">{{ listing.bids.count }} bid(s) so far. Your bid is the current bid</label>
                    </div>
                    <div class="form-group">
                    {{ form }}
                    </div>
                    <div class="form-group">
                    <input type="submit" name="button" class="btn btn-primary" value="Place Bid">
                    </div>
                </form>
                    {% if listing.activate %}
                        <li><strong>Winner: </strong>{{ listing.bids.last.user.username }}</li>
                    {% endif %}

                    {% if user.username == listing.creator.username and not listing.activate %}
                    <form action="{% url 'viewList' listing.id %}" method="POST">
                        {% csrf_token %}
                        <button type="submit" name="button" class="btn btn-danger" value="Close">Close</button>
                    </form>
                    {% endif %}

                </div>

            </ul>
        </div>

在这个视图中,我添加了我的项目要求(评论/监视列表(书签)/最后一件事(我有很多问题)是投标系统),它允许用户在这些帖子上添加投标并让该帖子的创建者能够关闭它....请帮助我坚持这个区域,我尝试了很多次才能理解! 注意我是后端开发的新手

标签: pythonpython-3.xdjango

解决方案


你的代码有两个问题,第一个是 Husam 高亮显示的 user = User.objects.get(username=request.user.username) ,另一个是在 else 部分的 return 语句中

render(request, 'acutions/item.html', {'form'})而不是上下文对象,您传递的字符串在 python 中被视为set对象,这就是您收到None type错误的原因。

这是重构的代码:-

def viewList(request, id):
        # check for the watchlist
        listing = Post.objects.get(id=id)
        user = User.objects.get(username=request.user.username)
        form = BidForm()
        is_watched = listing.watchers.filter(id=request.user.id).exists():
        context = {}
        if not listing.activate:
              if request.POST.get('button') == "Close":
                  listing.activate = True
                  listing.save()
        else:
            price = request.POST.get('bid', 0)
            bids = listing.bids.all()
        if user.username != listing.creator.username:
            if price <= listing.price:
                context.update({'message':"Error! your bid must be largest than the current bid !"})
            else:    
                form = BidForm(request.POST)
                if form.is_valid():
                    bid = form.save(commit=False)
                    bid.user = user
                    bid.save()
                    listing.bids.add(bid)
                    listing.bid = price
                    listing.save()
                else:
                    return render(request, 'acutions/item.html', {'form': form})

        context.update({'listing': listing,
          'comment_form': CommentForm(),
          'comments': listing.get_comments.all(),
          'is_watched': is_watched,
          'form': form})
        return render(request, 'auctions/item.html', context)

推荐阅读