【问题标题】:Field 'id' expected a number but got 'bidding'字段 'id' 需要一个数字,但得到了 'bidding'
【发布时间】:2021-06-03 13:51:34
【问题描述】:

我正在从模型构建一个 html 页面。添加到页面的是一个表单,它似乎会干扰我用来构建页面的模型。

我收到以下错误消息: 异常类型:/bidding 处的 ValueError 异常值:字段 'id' 需要一个数字,但得到了 'bidding'。

HTML (listing.html)

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

    <h3>{{listing.0.listingName}}</h3>
    <p><img class="listingImage" src="{{listing.0.listingImage}}"></p>
    <p>{{listing.0.listingDesc}}</p>
    <h5>Price: $ TODO</h5>

    {% if user.is_authenticated %}
        <form action="{% url 'bidding' %}" method="POST">
            {% csrf_token %}    
            <input type="number" name="amount" placeholder="Bid">
            <input class="btn btn-primary" type="submit" value="Bid">
        </form>
    {% endif %}

    <h5>Details</h5>
    <ul>
        <li>Listed by: {{listing.0.listingPoster}}</li>
        <li>Category: {{listing.0.listingCategory}}</li>
    </ul>
    <p>Comments:</p>
    <p>TODO</p>

{% endblock %}

Views.py

def listing(request, listing):
    return render(request, "auctions/listing.html",{
        "listing" : Listing.objects.filter(id=listing)
    })

def bidding(request):
    if request.method == "POST":
        bidAmount = int(request.POST["amount"])
        ### logic comes here
        return HttpResponseRedirect(reverse("listing"), args=5 )
        ### args is hardcoded for testing only

models.py

class Listing(models.Model):
    CATEGORIES = (
        ('fashion','fashion'),
        ('electronics','electronics'),
        ('sports','sports'),
        ('home','home'),
        ('motors','motors'),
        ('art','art'),
        ('business','business'),
        ('media','media'),
        ('others','others')
    )

    listingPoster = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Poster")
    listingName = models.CharField(max_length=128, verbose_name="Auction item")
    listingDesc = models.TextField(blank=True, verbose_name="Item description")
    listingActive = models.BooleanField(default=True, verbose_name="Active listing")
    listingImage = models.URLField(blank=True, verbose_name="Link to image")
    listingCategory = models.CharField(max_length=64, choices=CATEGORIES, default='others', verbose_name="Category")
    listingFirstBid = models.DecimalField(max_digits=8, decimal_places=2, default=1.0, verbose_name="Starting bid")
    listingCreated = models.DateTimeField(auto_now_add=True, null=True)
    watchers = models.ManyToManyField(User, blank=True, related_name="watchedListings", verbose_name="Watchers")
    ### requires the Pillow library to be installed

    def __str__(self):
        return f"{self.listingPoster} {self.listingName} {self.listingCategory} {self.listingActive}"

urls.py

urlpatterns = [
    path("<str:listing>", views.listing, name="listing"),
    path("bidding", views.bidding, name="bidding")
]

【问题讨论】:

  • 你在哪里得到错误?哪条线?不要让我们猜测。
  • 这是让我感到困惑的事情之一。错误消息中没有行。这是回溯:dpaste.com/DFJQLPT8K
  • 威廉有正确的答案。我在他发帖后不久就发现了。

标签: python html django forms


【解决方案1】:

你应该交换模式,这样如果你访问bidding/,那么它首先会查看bidding视图的路径,并且只有当路径不匹配时才会进一步查看,所以:

urlpatterns = [
    #       &downarrow; first bidding
    path('bidding/', views.bidding, name='bidding'),
    path('<str:listing>/', views.listing, name='listing'),
]

由于您的 listing 参数应该使用整数主键,您还可以使用 int 路径转换器指定仅接受数字序列的路径:

urlpatterns = [
    path('bidding/', views.bidding, name='bidding'),
    #       &downarrow; int path converter
    path('<int:listing>/', views.listing, name='listing'),
]

【讨论】:

    【解决方案2】:
      def listing(request, listing):
      return render(request, "auctions/listing.html",{
           "listing" : Listing.objects.filter(id=listing)
      })
    

    此视图函数采用第二个参数,列表由 URL 传递:

    path("

    ", views.listing, name="listing")

    在此路径中,您声明 URL 返回变量 listing,该变量被声明为视图函数的字符串。因此,当您的过滤器函数在您的数据库上运行时,参数id 被赋予一个由变量listing 表示的字符串

    【讨论】:

      【解决方案3】:
      urlpatterns = [
        path("<str:listing>", views.listing, name="listing"),//This line is the culprit
        path("bidding", views.bidding, name="bidding")
      ]
      

      将第一个路径更改为如下所示,它将强制输入为整数。

      path("<int:listing>", views.listing, name="listing")
      

      【讨论】:

        猜你喜欢
        • 2021-08-31
        • 1970-01-01
        • 2021-07-03
        • 2021-01-22
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-22
        相关资源
        最近更新 更多