Django is_valid () renvoie ValueError lors de la présentation d'un formulaire. Pas certain de pourquoi
-
27-10-2019 - |
Question
Le code suivant crée un formulaire basé sur un modèle, Post
. Problème Je suis face est que la forme valide et ne donne ValueError que données ne validait pas si je retire le contrôle de if post_form.is_valid():
.
Cependant, si je garde le code comme illustré ci-dessous, qui est, je garde le contrôle de if post_form.is_valid():
, il échoue toujours et le bloc else
est exécuté.
Je tente de sauver l'utilisateur, qui est un ForeignKey à Auth de Django, dans mon modèle et il se trouve que je ne peux même pas passé cette erreur de vlaidation.
Toute aide sera appréciée. Merci.
#----------------------------Model--------------------------------------
class Post (models.Model):
name = models.CharField(max_length=1000, help_text="required, name of the post")
user = models.ForeignKey(User, unique=False, help_text="user this post belongs to")
def __unicode__(self):
return self.name
class PostForm(ModelForm):
class Meta:
model = Post
#----------------------------./Model--------------------------------------
#----------------------------View--------------------------------------
@login_required
def create_post (request):
if request.method == 'POST':
post_form = PostForm(request.POST)
if post_form.is_valid():
post.save()
return render_to_response('home.html')
else:
return HttpResponse('not working')
else:
post_form = PostForm()
return render_to_response('create.html', {'post_form':post_form })
#----------------------------./View--------------------------------------
#----------------------------./Template--------------------------------------
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>home</title>
</head>
<body>
<form method="POST" action='.'>{% csrf_token %}
<p>{{post_form.name.label_tag}}</p>
<p>{{post_form.name}}</p>
<p><input type="submit" value="Submit"/></p>
</form>
</body>
</html>
#----------------------------./Template--------------------------------------
La solution
Dans votre autre poste, vous essayiez de automatiquement insérer le champ user
, ce qui signifie probablement que vous ne disposez pas d'un champ user
affiché dans le modèle.
Ne comptez pas si vous prévoyez d'insérer l'utilisateur de toute façon.
class PostForm(ModelForm):
class Meta:
model = Post
exclude = ('user',) # exclude this
if request.method == 'POST':
post_form = PostForm(request.POST)
if post_form.is_valid():
post = post.save(commit=False)
post.user = request.user
post.save() # now post has a user, and can actually be saved.
return render_to_response('home.html')
Autres conseils
Il ne montre pas valide, parce que la forme est pas valide. On peut supposer que celui qui envoyé le formulaire n'a pas rempli les champs obligatoires. Si vous affichez la valeur de form.errors
vous verrez pourquoi.
Sinon, même si nous devons deviner parce que vous ne l'avez pas montré le modèle, vous n'avez pas inclus tous les champs obligatoires dans le modèle lui-même, par conséquent, la forme ne sera jamais valide.
Supprimer la première clause de else
avec son HttpResponse. La vue par défaut sera alors de montrer à nouveau le formulaire, avec des erreurs.