#python #django #valueerror
Вопрос:
Я работаю над проектом Django и получаю ошибку значения ниже. Я думаю, что проблема в поле категория, потому что, если я прокомментирую это в new.html, это добавление списка без проблем. Однако я не могу найти, в чем ошибка:
Ошибка ValueError при /создании представления auctions.views.add_listing не вернул объект HttpResponse. Вместо этого он ничего не вернул.
Это мое 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
Комментарии:
1. не могли бы вы, пожалуйста, добавить свой
forms.py
?2. вы уверены в этом:
return HttpResponseRedirect(reverse(listing, args={new_listing.pk,}))
? Я не вижу никакойlisting
переменной в представлении3. Вы написали в своем
add_listing
представлении,if form.is_valid(): ... else: pass
. Ваша форма недействительна, затем вы вводите в блок else, который также не возвращает объект httpresponse. Вместо этого вы должны перенаправить на тот же вид (... else: return redirect('.')
4. @Кристоф, я добавил формы. Что касается переменной списка, я передаю ее для перенаправления на страницу списка
5. @Rvector, я добавил
else:pass
просто для устранения неполадок. Если я удалю его, ошибка все еще будет там