Problema ao Tentar Inserir Dados no Site de Administração

Estou seguindo um tutorial de Django para treinar e fazer um site de votação simples. Em determinado momento, quando preciso colocar o servidor em execução e adicionar perguntas às enquetes, me deparo com os códigos de erro abaixo:

sqlite3.IntegrityError: NOT NULL constraint failed: polls_question.question_text
django.db.utils.IntegrityError: NOT NULL constraint failed: polls_question.question_text

Eu esperava poder adicionar perguntas no campo de perguntas criado no banco de dados, mas me deparei com esses erros. O que eu faço?

— Google translated text —

Você está seguindo o tutorial oficial do Django? Em caso afirmativo, em que etapa você está e em que seção da página?

Quais são especificamente as ações que você está realizando para tentar adicionar dados?

  • Você está fazendo isso através do shell do Django?
  • Você está tentando fazer isso usando o Django Admin?

— And the original English —

Are you following the official Django tutorial? If so, what step are you on and at what section of the page?

What specifically are the actions you are taking to try and add data?

  • Are you doing this through the Django shell?
  • Are you trying to do this using the Django Admin?
1 Like

Bom dia. Sim estou seguindo o tutorial oficial do Django e praticamente copiando e colando as linhas de código justamente para evitar erros. Estou na etapa dois, na seção Explore a funcionalidade de administração de graça (Neste link: Writing your first Django app, part 2 | Django documentation | Django).

Deixe-me explicar como o erro ocorre. Primeiro eu rodo o servidor local em meu computador e, no navegador, vou na sessão “Polls” e clico no campo “Questions”. Em seguida, na nova página aberta e na mesma sessão “Polls”, clico em adicionar.

Porém, na página seguinte não há label para inserção de dados e criação de uma nova questão! Alguém no Stack Over Flow me disse que a causa disso é que “question_text” não deve ser um arquivo nulo, mas não estou conseguindo localizado no meu banco de dados para poder dar-lhe outro valor.

Por fim, eu tento apertar o botão “salvar” só por curiosidade. E recebo a seguinte página de erro:

E no terminal do Power Shell em meu computador aparece os erros já especificados antes.

— Google translated text —

Você seguiu as etapas na seção Jogando com a API? Esses não podem ser facilmente copiados/colados e as etapas não devem ser ignoradas.

(Observação: eu recomendo fortemente não copiar/colar o código. Foi demonstrado inúmeras vezes que você aprende e retém muito mais digitando o código - e corrigindo os erros que ocorrem como resultado disso).

Acho que o Google Tradutor não está fazendo um bom trabalho aqui - não estou entendendo muito bem o que você está tentando explicar. Você poderia postar uma captura de tela do que está vendo?

— And the original English —

Did you follow the steps in the Playing with the API section? Those can’t be easily copy/pasted and the steps must not be skipped.

(Side note: I strongly recommend against copy/pasting the code. It’s been demonstrated numerous times that you learn and retain a lot more by actually typing the code - and correcting the errors that happen as a result of doing so.)

I think Google translate isn’t doing a good job here - I"m not quite understanding what you’re trying to explain. Could you please post a screen shot of what you’re looking at?

Bom dia. Desculpe a demora em responder. Sim, eu segui esta parte do tutorial, mas não obtive as saídas mostradas no prompt e fiquei confuso com isso. Resolvi, então, seguir com o tutorial apesar disso. Eu não enviei mais prints nas respostas porque o site não permite mais de um print por comentário para quem é novato. Vou postar um comentário por print para deixar mais claro. Veja o que aparece quando eu tento colocar o comando Question.objects.all() no Power Shell:

Este comando é o primeiro a ser executado de acordo com a sessão Jogando com a API. Não sei porque ele diz que a variável Question não foi definida se eu segui o passo a passo da maneira certa. Queria explicar também que entendo a importância de digitar ao invés de copiar e colar os códigos, mas fiz isso somente nesse caso para evitar erros. Porém, mesmo assim, eles apareceram.

Na verdade, não é. O primeiro comando nessa seção é a instrução import que aparece bem no topo dessa seção do tutorial. Isso é o que você está perdendo aqui.

— And the original English —

Actually, it is not. The first command in that section is the import statement that appears at the very top of that tutorial section. That is what you are missing here.

Realmente não atentei para este comando no início. Porém, agora está sendo retornado um erro de tipo. Desde já obrigado pela ajuda.

— Google translated text —

Como é o seu arquivo polls/models.py? (Por favor, copie/cole o conteúdo desse arquivo em sua postagem, entre linhas de três acentos graves - ` caracteres. Isso significa que você terá uma linha de ```, depois o conteúdo desse arquivo e outra linha de ```. Por favor, não poste uma imagem de tela desse arquivo.)

— The original English text —

What does your polls/models.py file look like? (Please copy/paste the contents of that file into your post, between lines of three backtick - ` characters. This means you’ll have a line of ```, then the contents of that file, then another line of ```. Please do not post a screen image of that file.)

Certo. A seguir está o conteúdo de polls/models.py:


from django.db import models
from django.utils import timezone

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text


class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

— Google translated text —

Você tem duas classes chamadas Question definidas aqui. Você deve ter apenas uma classe com esse nome. Todo o conteúdo de ambos deve estar na mesma classe.

As mudanças que você vê listadas em https://docs.djangoproject.com/en/4.2/intro/tutorial02/#playing-with-the-api são modificações na definição da classe definida anteriormente, não novas definições para adicionar para o arquivo. (O # .... é usado como um indicador para mostrar que tudo anterior a isso ainda está nessa classe.)

Por exemplo, os documentos anteriores ao primeiro conjunto de alterações:

Vamos consertar isso editando o modelo Question (no arquivo polls/models.py) e adicionando um método __str__() tanto para Question quanto para Choice:

[Enfase adicionada]

— And the original English —

You have two classes named Question defined here. You should only have one class by that name. All the contents of both should be in the same class.

The changes you see listed at https://docs.djangoproject.com/en/4.2/intro/tutorial02/#playing-with-the-api are modifications to the definition of the class defined earlier, not new definitions to add to the file. (The # .... is used as an indicator to show that everything previous to this is still in that class.)

For example, the docs prior to the first set of changes:

Let’s fix that by editing the Question model (in the polls/models.py file) and adding a __str__() method to both Question and Choice:

[Emphasis added]

Certo. Deixe-me ver se entendi corretamente. No caso eu devo adicionar informações no arquivo e não deletar ou alterar, correto? Se este for o caso, eu deixei somente uma classe Question e inseri todas as linhas de código passadas pelo tutorial nela. Ficou assim:

import datetime

from django.db import models
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    def __str__(self):
        return self.question_text
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    
    def __str__(self):
        return self.choice_text

Mesmo assim continuo tendo o mesmo erro:

TypeError: Question() got unexpected keyword arguments: 'question_text', 'pub_date'

— Google translated text —

Depois de corrigir sua classe, você precisará executar novamente os comandos makemigrations e migrate para corrigir seu banco de dados.

Por favor, confirme se você não tem mais nada em seu arquivo models.py.

Além disso, depois de fazer essas alterações, você está parando e reiniciando o shell, correto?

— Original English text —

After fixing your class, you will need to rerun the makemigrations and migrate commands to fix your database.

Please confirm that you don’t have anything else in your models.py file.

Also, after making these changes, you are stopping and restarting the shell, correct?

Olá. Eu tentei rodar estes comandos que você falou, mas ele informa que “não foram detectadas alterações”. Para ver o que estava acontecendo procurei ajuda de um outro programador experiente em Django também. Ele me recomendou apagar o pycash e o arquivo 0001_initial.py e tentar salvar as alterações novamente com o makemigrations, mas mesmo assim as alterações não foram identificadas. Este é o conteúdo presente em models.py:


from django.db import models
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField("date published")
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    def __str__(self):
        return self.question_text
    
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    
    def __str__(self):
        return self.question_text
    
    def was_published_recently(self):
        return self.pub_date >=timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    
    def __str__(self):
        return self.choice_text

Existem algumas coisas a mais porque eu avancei um pouco mais no tutorial quando vi que, agora, conseguia inserir perguntas no site de administração.

— Google translated text —

Isso significa que nada precisava ser feito.

Isso não era necessário.

Se as coisas estão funcionando e você já passou do problema anterior, não há nada com que se preocupar no momento.

(Embora, devo apontar que excluir o arquivo de migração não foi uma boa coisa a fazer. Você nunca deseja fazer isso, a menos que esteja realmente confortável com o que acontece como resultado disso. O que posso sugerir nesse ponto é que você também exclui o banco de dados e tente novamente.)

— Original English text —

This means that nothing needed to be done.

This wasn’t necessary.

If things are working, and you’re past the previous issue, then there’s nothing you need to worry about at the moment.

(Although, I will point out that deleting the migration file was not a good thing to do. You never want to do that unless you’re really comfortable with what happens as a result of that. What I might suggest at that point is that you also delete the database and try that again.)