python - 如何使用外键 django 创建表单
问题描述
我正在处理一个 Django 项目并收到下面的 Value 错误。我认为问题出在类别字段中,因为如果我将在 new.html 中对其进行评论,它会添加一个没有问题的列表。但是,我找不到错误在哪里:
/new 处的ValueError 视图auctions.views.add_listing 未返回HttpResponse 对象。它返回 None 。
这是我的models.py:
class Category(models.Model):
name = models.CharField(max_length=64)
def __str__(self):
return self.name
class Listing(models.Model):
title = models.CharField(max_length=64)
description = models.CharField(max_length=256)
price = models.DecimalField(max_digits=24, decimal_places=2)
photo = models.ImageField()
bid = models.ForeignKey(Bid, on_delete=models.CASCADE, blank=True, null=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
category = models.ManyToManyField(Category, default=None, blank=True)
def __str__(self):
return self.title
视图.py:
def add_listing(request):
if request.method == "POST":
form = ListingForm(request.POST, request.FILES)
print('FORM CREATED')
print(form.is_valid())
if form.is_valid():
print('FORM IS VALID')
print(form.cleaned_data)
new_listing = form.save(commit=False)
return HttpResponseRedirect(reverse(listing, args={new_listing.pk,}))
else:
pass
else:
return render(request, "auctions/new.html",{
'category':Category.objects.all()
})
新的.html:
<form action="" method="POST" name="listing" enctype="multipart/form-data">
{% csrf_token %}
<h4>Title</h4>
<input type="text" name="title">
<h4>Choose category</h4>
<select name="category" id="">
{% for type in category %}
<option value="{{ type }}" name="category">{{ type }}</option>
{% endfor %}
</select>
<h4>Description</h4>
<input type="text" name="description">
<h4>Price</h4>
<input type="number" name="price">
<h4>Photo</h4>
<input type="file" accept="image/*" name="photo" id="file">
<!-- <p>Or provide URL of image</p>
<input type="text" name="image_url"/> -->
<input type="submit" value="Post"/>
</form>
表格.py:
class ListingForm(forms.ModelForm):
category = forms.CharField()
class Meta:
model = Listing
fields = [
"title",
"description",
"price",
"photo",
"category"
]
def save(self, commit=True):
category, created = Category.objects.get_or_create(
name = self.cleaned_data['category']
)
self.cleaned_data['category'] = category.id
return super(ListingForm, self).save(commit)
def __str__(self):
return self.title
解决方案
推荐阅读
- jquery - Bootstrap modal pop 将成为 iframe 的顶部
- python - 在 tensorflow 的急切执行训练期间修复部分变量
- go-modules - 如何验证来自 Bash 的 go.sum 模块哈希?
- javascript - 如何用 jquery 修复 tfoot
- r - 更改多门对象的提示标签
- java - 有人可以帮我理解Java中的这个for循环吗?
- c# - 当 Redis 节点出现故障时,我从 StackExchange.Redis 中得到很多“System.ObjectDisposedException”(在池中?)
- elixir - 如何在 Ecto 关联中查询第三个关系
- c++ - 如何解决 Visual Studio 中的“错误 LNK2001:无法解析的外部符号 _Main”
- data-warehouse - 如何在 DataWarehouse 表中插入数据以获取早期到达的事实?要遵循的程序是什么?