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?
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:
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.
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.)
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:
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:
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:
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.)