form.is_valid винаги невярно

Опитвам се да разбера защо form.is_valid винаги връща false, но все още не съм го разбрал и не помага, че току-що започнах с Django.

Модела

class Post(models.Model):
STATUS_CHOICES = (
    ('d', 'Draft'),
    ('p', 'Published'),
)
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=120, null=True, blank=True)
text = models.TextField(max_length=500, null=True, blank=True)
slug = models.SlugField(max_length=40, unique=True)    
publish_date = models.DateTimeField(null=True)
status = models.CharField(choices=STATUS_CHOICES, max_length=1,default='d')

Формуляр

class PostForm(forms.ModelForm):
class Meta:
    model = Post
    fields = ('title','author','slug','text','publish_date','status')

    widgets = {
        'title': forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Title'}),
        'author': forms.Select(),
        'slug': forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Slug'}),
        'text': forms.Textarea(attrs={'class' : 'form-control', 'placeholder' : 'Text'}),
        'publish_date': forms.DateInput(attrs={'class' : 'form-control', 'placeholder' : date.today}),
        'status': forms.NullBooleanSelect(attrs={'class' : 'form-control'}),
    }

Преглед

def admin(request):
if request.user.is_authenticated:
    if request.user.is_staff:
        users = User.objects.all().order_by('date_joined').reverse()[:5]
        posts = Post.objects.all().order_by('created').reverse()[:5]
        publications = Publication.objects.all().order_by('created').reverse()[:5]
        form = PostForm()
        args = {'profile' : users ,'posts' : posts, 'publications' : publications, 'form' : form }
        if request.POST:
            print('request is posting')
            if form.is_valid():
                form.save()
            else:
                print('Error in saving')
        return render(request, 'webadmin/index.html',args)
    else:
        return index(request)
else:
    return redirect('/webmaster/login/')

Надявам се, че можете да ми помогнете, Благодаря ви OWO)/


person Henouji Kun    schedule 31.10.2018    source източник
comment
Променете form = PostForm() на form = PostForm(request.POST or None)   -  person art    schedule 31.10.2018


Отговори (1)


Тук:

form = PostForm()
if request.POST:
    if form.is_valid():

опитвате се да валидирате необвързан формуляр, което гарантирано ще се провали - трябва да предадете данни (в този случай request.POST), за да имате какво да валидирате. Вашият код всъщност трябва да изглежда нещо като:

# explicitely test against request.method - 
# you can have a POST request with an empty body, 
# in which case `request.POST` will be empty and
# have a false value in a boolean test
if request.method == "POST":
    form = PostForm(request.POST)
    if form.is_valid():
        # ...

Сега дори предаването на request.POST не означава, че вашият формуляр непременно ще бъде валидиран, но просто отпечатване на нещо като „'Грешка при записване'" няма да ви каже какво не е наред или липсва.

Невалиден формуляр има .errors атрибути, които изброяват всички грешки при валидиране. Тези грешки при валидиране се показват автоматично във вашия шаблон, ако използвате {{ form }} (или негови варианти {{ form.as_p }}, {{ form.as_table }} и т.н., за да изобразите формуляра във вашия шаблон (което не сте публикували тук). Ако изобразявате формуляра ръчно, трябва да помислите да изобразявате грешките и сами както е документирано тук (Надявам се, че поне използвате полетата на формуляра за изобразяване, вместо да пишете целия html код на формуляра ръчно...).

Във всички случаи можете поне да започнете с отпечатването на form.errors във вашия изглед, така че да имате представа какво не се валидира, т.е.

    if form.is_valid():
        form.save()
    else:
         print("errors : {}".format(form.errors))

Имайте предвид, че всичко това е ясно документирано, така че бихте могли да намерите отговорите сами. Разбирам, че Django е доста голяма рамка и че може да отнеме време, за да я овладеете, но има доста добър урок и обширна документация с много примери, така че наистина трябва да направите урока и да започнете да разглеждате документа, поне за имайте представа какво можете да намерите и къде да търсите, когато нещо "не работи".

person bruno desthuilliers    schedule 31.10.2018
comment
Добре, реших проблема, промених NullBooleanSelect на Status само на Select, което му даде стойност, за да продължи към валидиране, благодаря ви, че ми казахте да чета. - person Henouji Kun; 01.11.2018