字段 'id' 需要一个数字,但得到了 'bidding'

时间:2021-03-04 21:13:26

标签: python html django forms

我正在从模型构建 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 %}

视图.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")
]

3 个答案:

答案 0 :(得分:3)

您应该交换模式,这样如果您访问 qry1.SQL.Text := 'SELECT * FROM sales ' + 'WHERE sale_id = 1'; qry1.Open; qry1.Insert; qry1.FieldByName('date').AsDateTime := Date; qry1.FieldByName('total').AsFloat := total; qry1.Post; saleId := qry1.FieldByName('sale_id').AsInteger; qry1.Close; // Code to save sale details using saleId. ,那么它首先会查看 bidding/ 视图的路径,并且仅当路径不匹配时才进一步查看,因此:

bidding

由于您的 urlpatterns = [ # ↓ first bidding path('bidding/', views.bidding, name='bidding'), path('<str:listing>/', views.listing, name='listing'), ] 参数应该使用作为整数的主键,您还可以使用 listing 路径转换器指定仅接受数字序列的路径:

int

答案 1 :(得分:0)

<块引用>
  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

表示的字符串

答案 2 :(得分:0)

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")