Ajuda com projeto Django (Salvar dados no banco de dados
Olá, venho aqui buscar ajudar com um problema de salva dados de um formulário no banco de dados. Segue o código
@login_required(login_url='authors:login', redirect_field_name='next')
def dashoard_recipe_edit(request, id):
form = Recipe.objects.filter(
is_published=False,
user=request.user,
pk=id
).first()
if not form:
raise Http404()
form = AuthorRecipeForm(
request.POST or None,
instance=form
)
if form.is_valid():
recipe = form.save(commit=False)
recipe.user = request.user
recipe.preparation_steps_is_html = False
recipe.is_published = False
recipe.save(comit=True)
messages.success(request, 'Sua receita foi salva com sucesso!')
return redirect(reverse('authors:dashboard_recipe_edit', args=('id',)))
return render(request, 'pages/dashboard-recipe.html',
{'forms': form}
)
isso ai tá igual ao do professor, o problema é que quando eu estou lá no meu formulário e aperto em salvar os dados, ele não está salvando no banco de dados, alguém ai sabe onde eu estou errando?
edit: Já entendi o erro, ele está no form que não está validando, mas o problema agora é o porque
Mude o nome da variável "form" para "recipe" na primeira linha da view, já qué uma instância do seu model e não um form. Sem ver o erro é difícil ajudar, mas veja se seu form no template está com method="post" e incluindo o {% csrf_token %}.
No curso que eu estou fazendo está form msm e está funcionando no da aula que eu estou assistindo e quanto a erros, o problema é que não aparece nenhum erro, nenhum!
Longe de querer questionar a metodologia do seu professor, mas existem problemas nessa view. A começar pela instância do model que mencionei, tem também o "comit" faltando um "m" que só não deu erro porque seu form não passou na validação, e outras coisas que poderiam ser simplificadas, como usar o get_object_or_404 ao invés desse bloco todo.
Sobre a validação, seria legal você postar o template e o seu AuthorRecipeForm. De qualquer forma, você pode debugar na view mesmo, antes do form.is_valid() verifique o retorno do "form.errors" para ter uma ideia do que está acontecendo.
Segue o bloco
```
class AuthorRecipeForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
add_attr(self.fields.get('preparation_steps'), 'class', 'span-2')
add_attr(self.fields.get('cover'), 'class', 'span-2')
class Meta:
model = Recipe
fields = 'title', 'description', 'preparation_time', \
'preparation_time_unit', 'servings', 'servings_unit', \
'preparation_steps', 'cover',
widgets = {
'cover': forms.FileInput(
attrs={
'class': 'span-2'
}
),
'servings': forms.Select(
choices=(
('Porções', 'Porções'),
('Pedaços', 'Pedaços'),
('Pessoas', 'Pessoas'),
)
),
'preparation_time_unit': forms.Select(
choices=(
('Horas', 'Horas'),
('Minutos', 'Minutos'),
)
)
}
```
edit: Encontrei o erro: Estava nesse servings que estava esperando um valor numerico , mas quando eu usei o forms.Select eu comecei a passar um texto para ele fazendo com que desse erro.
Primeiramente, manda o seu html também pra gente saber como você colocou
<!-- Sem arquivos -->
<form method="POST" action="{% url "sua_url" kwargs %} >
...
<!-- Com arquivos -->
<form method="POST" action="{% url "sua_url" kwargs %} enctype="multipart/form-data" />
####
recipe.save(comit=True)
###
recepe.save(commit=True)
``
Ele está assim:
manda o repoo do github pra eu fazer uma copia e editar o que tá errado.
`<`form action="{{ form_action }}" method="POST" enctype="multpart/form-data">
Troca esse form action para url.