Как создать форму с внешним ключом django

#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 просто для устранения неполадок. Если я удалю его, ошибка все еще будет там