Is_valid() не работает с моей формой в Django

Я начинающий пользователь Django 4.1. Я использую модель для редактирования формы и отображения ее на веб-странице. Все работает правильно. Когда я нажимаю на submit, моя функция распознает метод POST, но никогда не проверяет форму. Я уверен, что мне нужно исправить ошибку в моих моделях или форме, но я не знаю где.

в models.py

class Auction(models.Model):
    HOUSE = "HOU"
    MOTORS = "MOT"
    PROPERTY = "PPT"
    HOBBIES = "HOB"
    INFORMATION_TECHNOLOGY = "IT"
    MUSIC = "MUS"
    BOOK = "BOK"

    CATEGORY_CHOICES = [
        (HOUSE, "All for your House"),
        (MOTORS, "Car, Moto, Boat"),
        (PROPERTY, "Houses, flats, manors"),
        (HOBBIES, "Hobbies"),
        (INFORMATION_TECHNOLOGY, "Laptop, Desktop, Mobile Phone"),
        (MUSIC, "CD, Musical Intrusments"),
        (BOOK, "Books, Comics,...")
    ]


    ONE = 1
    THREE = 3
    SEVEN = 7
    FOURTEEN = 14

    DURATION_CHOICES = [
        (ONE, "1 day"),
        (THREE, "3 days"),
        (SEVEN, "7 days"),
        (FOURTEEN, "14 days")
    ]

    title = models.CharField(max_length=64)
    description = models.TextField(max_length=500, blank=True)
    creation_date = models.DateTimeField(auto_now_add=True)
    image = models.URLField(null=True, blank=True, default="")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="seller")
    duration = models.CharField(max_length=7, choices=DURATION_CHOICES, default=SEVEN)
    category = models.CharField(max_length=3, choices=CATEGORY_CHOICES, default=INFORMATION_TECHNOLOGY)
    price = models.DecimalField(max_digits=12, decimal_places=2, default=0.0)

    def __str__(self):
        return f"{self.id}: {self.title}"

в файле forms.py

class CreateListingsForm(forms.ModelForm):

    class Meta:
        model = Auction
        fields = ["title", "description", "image", "category", "duration", "price"]

и в views.py

def create(request):
    if request.method == "POST":
        form = CreateListingsForm(request.POST)
        form.instance.user = request.user
        form.instance.creation_date = datetime.now()
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse("index"))
        else:
            return render(request, "auctions/listings.html", {
            "form": form
            })
    else:
        form = CreateListingsForm()
        return render(request, "auctions/listings.html", {
            "form": form
        })

Я пытался обработать экземпляр как показано ниже. Я также пытался переопределить init в моей форме.

Редактирование: Я сделал print(form.error) и результат <ul class="errorlist"><li>duration<ul class="errorlist"><li>Select a valid choice. 7 is not one of the available choices.</li></ul></li></ul>. Может проблема в моем значении по умолчанию?

Edit2:

ошибкой был тип поля, поэтому оно работает, когда я изменил его на `IntegerField

Можете ли вы опубликовать пример того, что вы отправляете в своей форме?

EDIT

duration = models.CharField(max_length=7, choices=DURATION_CHOICES, default=SEVEN)

max_length и min_length :- Если предоставлены, то эти аргументы гарантируют, что строка имеет максимальную или минимальную заданную длину.

Я не думаю, что вы проверяете, имеет ли int максимальное значение меньше или равно 7, поэтому это и приводит к ошибке валидации. Вам нужно изменить это и, возможно, добавить правило проверки в вашу форму или изменить CharField на числовое поле.

Я думаю, что у вас нет user и creation_date в списке полей (["title", "description", "image", "category", "duration", "price"]), поэтому ваша форма будет недействительной.

Попробуйте это

def create(request):
    if request.method == "POST":
        form = CreateListingsForm(request.POST)
        if form.is_valid():
            listing = form.save(commit=false)
            listing.user_id = request.user.pk
            listing.create_date = datetime.now()
            listing.save()
            return HttpResponseRedirect(reverse("index"))
        else: # I think this else block is not so necessary
            return render(request, "auctions/listings.html", {
            "form": form
            })
    else:
        form = CreateListingsForm()
        return render(request, "auctions/listings.html", {
        "form": form
        })

Пожалуйста, для английского языка

Просто вы можете попробовать следующее:

def create(request):
    if request.method == "POST":
        form = CreateListingsForm(request.POST)
        if form.is_valid():
           form.instance.user = request.user
           form.instance.creation_date = datetime.now()
           form.save()
           return HttpResponseRedirect(reverse("index"))
        else:
            return render(request, "auctions/listings.html", {
            "form": form
            })
    else:
        form = CreateListingsForm()
    return render(request, "auctions/listings.html", {
            "form": form
        })
Вернуться на верх