我正在从模型构建 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")
]
答案 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("
在此路径中,您声明 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")