Как создать форму с внешним ключом django
Я работаю над проектом Django и получаю ошибку Value, описанную ниже. Я думаю, что проблема в поле category, потому что если я закомментирую его в new.html, оно добавляет листинг без этой проблемы. Однако, я не могу найти, где находится ошибка:
Ошибка значения в /new Представление 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
views.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()
})
new.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>
forms.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