form.is_valid () всегда возвращает false - PullRequest
0 голосов
/ 09 мая 2011

Модельный класс

class Fuzz_Engine(models.Model):
    id = PositiveTinyIntField(primary_key = True)
    engine_name = models.CharField(max_length=16)
    version = models.CharField(max_length = 16)

    class Meta:
        db_table = 'fuzz_engine'
        unique_together = ('engine_name', 'version')

class AddFuzzEngineForm(ModelForm):
    class Meta:
        model = Fuzz_Engine

Просмотр класса

def addengine(request)
    if request.method == 'POST':
        form = AddFuzzEngineForm(request.POST)

        # input validation for add phone model form
        if form.is_valid():
            fuzzEngineToAdd = Fuzz_Engine (engine_name = request.POST['engine_name'], version = request.POST['version'])
            fuzzEngineToAdd.save(force_insert=True)

            return render_to_response('fuzz/fuzz_cengine_results.html', {'fid': fuzzEngineToAdd.id,'fe': fuzzEngineToAdd,},context_instance=RequestContext(request))
    else:
        form = AddFuzzEngineForm()

    return render_to_response('fuzz/add_fuzz_engine.html', {'form': form},context_instance=RequestContext(request))

Я рассмотрел несколько похожих вопросов по этому вопросу, попытался распечатать ошибки, но, похоже, их нет.

Наборы форм Django - form.is_valid () имеет значение False, препятствующее проверке набора форм form.is_valid () всегда возвращает false

У меня такое ощущение, что причина ошибки лежит в структуре класса моей модели.

.is_valid имеет значение false, поскольку я поместил код в этот оператор if, и он не выполняется, однако, если у меня есть оператор else (которого здесь нет), для которого, если он недействителен, он появится.

Может ли кто-нибудь предоставить другой способ устранения ошибок такого рода?

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

Пара проблем, трудно отладить код, если код, который вы вставляете, не отформатирован должным образом.Отступы были беспорядочными, поэтому я не уверен, вызывает ли это проблему.

Похоже, вы вручную присваиваете внешний ключ для своей модели.Я бы предложил просто позволить django обработать идентификатор модели:

class Fuzz_Engine(models.Model):
    engine_name = models.CharField(max_length=16)
    version = models.CharField(max_length = 16)

    class Meta:
        db_table = 'fuzz_engine'
        unique_together = ('engine_name', 'version')

Ваша форма выглядит отлично:

class AddFuzzEngineForm(ModelForm):
    class Meta:
        model = Fuzz_Engine

Некоторые проблемы, которые я вижу в ваших взглядах, включают:

  1. вы не должны использовать request.POST ['field_names'] напрямую.вы должны получать cleaned_data из вашей формы.
  2. вы можете сохранить форму напрямую, потому что это ModelForm.если вам нужен только что созданный экземпляр, то есть то, что возвращается из метода save, вы можете установить переменную и использовать ее, как показано ниже.

    def addengine(request)
        if request.method == 'POST':
            form = AddFuzzEngineForm(request.POST)
    
            if form.is_valid():
                instance = form.save()
                return render_to_response('fuzz/fuzz_cengine_results.html', {'fid': instance.id,'fe': instance,},context_instance=RequestContext(request))
        else:
            form = AddFuzzEngineForm()
    
        return render_to_response('fuzz/add_fuzz_engine.html', {'form': form},context_instance=RequestContext(request))
    
  3. С вашим оригиналомПохоже, вы пытаетесь сохранить экземпляр Fuzz_Engine без id.

1 голос
/ 09 мая 2011

DTing имеет несколько замечательных моментов, но я подозреваю, что ваша настоящая проблема связана с вашим явным определением поля id в вашей модели. Если у вас нет действительно веской причины, вы никогда не должны этого делать - Django определяет поле автоинкремента автоматически, и редко когда есть какая-либо точка, переопределяющая это, если вы не используете устаревшую базу данных, которую нельзя изменить.

В вашем случае вы определили его как tinyint без автоинкремента. Это означает, что поле будет обязательным в любой форме, так как его нужно указывать вручную каждый раз, когда вы создаете новый экземпляр. Вы не показали шаблон, который используете для отображения формы, поэтому в этом нет уверенности, но я полагаю, что вы не показываете это поле вообще.

Если вы действительно хотите продолжать в том же духе, вам нужно указать exclude = ('id',) в форме Meta. Затем в своем предложении is_valid, принимая во внимание рекомендации DTing, вам нужно сделать следующее:

if form.is_valid():
    instance = form.save(commit=False)
    instance.id = some_function_for_calculating_id()
    instance.save()

Но, как я уже сказал, вам вообще не следует этого делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...