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 of Status на просто Select, что дало ему значение для перехода к проверке, спасибо, что посоветовали мне прочитать. - person Henouji Kun; 01.11.2018